码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 多线程技术2

时间:2015-08-02 21:47:02      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:queue   nsoperation   op   多线程   技术   

iOS 多线程技术2

NSOperation


  • NSInvocationOperation
        //创建一个队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];

        //创建子任务,定义子任务必须是 NSOperation 的子类
        NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(dosomething:) object:@"NSInvocationOperation"];

        //当把任务添加到队列后,自动开启线程
        [queue addOperation:op];
  • NSBlockOperation
            //创建一个队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];

        //创建 NSBlockOperation 对象
        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        [self doSomething];
        }];

        //加入队列
        [queue addOperat:operation];

Demo:
下面我用NSOperation 的两种方法来创建一个例子,实现与上篇一样的功能,

#import "ViewController.h"

---

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *iamgeView;
@property (weak, nonatomic) IBOutlet UILabel *lable;


@property (nonatomic, strong) NSOperationQueue *queue;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 1.NSInvocationOperation
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(dosomething:) object:@"NSInvocationOperation"];
    op.name = @"xiaoming";

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:op];

    NSLog(@"%@",queue.operations);
    _queue = queue;
}

- (void)dosomething:(NSString*)str
{
  //耗时操作
    [NSThread sleepForTimeInterval:3];

    //需要在主线程中更新 UI
    [self performSelectorOnMainThread:@selector(updateLable:) withObject:str waitUntilDone:YES];
}
- (void)updateLable:(NSString*)str
{
    if ([[NSThread currentThread] isMainThread]) {
        NSLog(@"主线程>>>%s",__func__);
    }
    _lable.text = str;
}
- (IBAction)btnAction:(UIButton *)sender {

    NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
        //耗时操作
        [NSThread sleepForTimeInterval:3];

        //创建 url
        NSString *urlStr = @"http://img.hb.aicdn.com/5a8f57157b47284724d09ffd2da28369731f8144ac9c-1XdZKJ_fw658";
        NSURL *url = [NSURL URLWithString:urlStr];
        NSData *data = [NSData dataWithContentsOfURL:url];

        UIImage *image = [UIImage imageWithData:data];

        //更新 UI
        [self performSelectorOnMainThread:@selector(updateImageView:) withObject:image waitUntilDone:YES];
    }];
    [_queue addOperation:blockOp];
}
- (void)updateImageView:(UIImage*)img
{
    if ([[NSThread currentThread] isMainThread]) {
        NSLog(@"主线程>>>>>>%s",__FUNCTION__);
    }

    _iamgeView.image = img;
}

@end

运行结果:
2015-08-02 15:03:33.909 05-NSOperationDemo[3284:874300] (
“{name = ‘xiaoming’}”
)
2015-08-02 15:03:36.911 05-NSOperationDemo[3284:874300] 主线程>>>-[ViewController updateLable:]
2015-08-02 15:03:47.730 05-NSOperationDemo[3284:874300] 主线程>>>>>>-[ViewController updateImageView:]

技术分享


版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS 多线程技术2

标签:queue   nsoperation   op   多线程   技术   

原文地址:http://blog.csdn.net/www_nyp_boke/article/details/47209523

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!