美文网首页
iOS多线程(四)-- NSOperation

iOS多线程(四)-- NSOperation

作者: eightzg | 来源:发表于2016-05-24 21:36 被阅读37次

    NSOperation是Objc语言的,底层实现基于GCD,线程的生命周期不需要程序员管理。要配合NSOperationQueue一起使用。

    NSOperation的使用步骤
    • 1.将要执行的操作放到NSOperation对象中
    • 2.将NSOperation放到NSOperationQueue中,即操作放到队列中。
    • 3.系统会自动将NSOperationQueue中的NSOperation取出来开启新的线程进行执行
    NSOperation是一个抽象类,不能被实例化,只能实例化它的子类
    • 1.使用子类NSInvocationOperation
    • 2.使用子类NSBlockOperation
    • 3.自定义类继承NSOperation,实现main方法。
    NSInvocationOperation的使用
    • 在viewDidLoad中编写代码如下
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 创建队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        
        // 创建操作
        NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];
        
        // 添加操作到队列中,会自动异步执行
        [queue addOperation:operation];
    }
    
    • download方法实现:
    - (void)download
    {
        NSLog(@"download-----%@", [NSThread currentThread]);
    }
    
    NSBlockOperation
    • 在viewDidLoad中编辑代码如下
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"---下载图片----1---%@", [NSThread currentThread]);
        }];
        
        NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"---下载图片----2---%@", [NSThread currentThread]);
        }];
        
        NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"---下载图片----3---%@", [NSThread currentThread]);
        }];
        
        NSBlockOperation *operation4 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"---下载图片----4---%@", [NSThread currentThread]);
        }];
        
        // 1.创建队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        
        // 2.添加操作到队列中(自动异步执行)
        [queue addOperation:operation1];
        [queue addOperation:operation2];
        [queue addOperation:operation3];
        [queue addOperation:operation4];
    }
    
    • NSBlockOperation是讲操作以block的形式封装起来,然后将操作对象放到队列中异步执行。
    NSOperation是基于GCD的Objc封装,不仅拥有所有GCD的功能,还拥有一些其他用法。
    • 1.设置最大并发数量,即同时执行的任务数。通过调用NSOperation对象的setMaxConcurrentOperationCount来实现。
    • 2.队列的取消,暂停,恢复
    Paste_Image.png
    • 3.添加到队列中的操作可以设置执行的优先级
    Paste_Image.png
    • 4.操作之间可以设置依赖,一个操作的执行依赖于其他操作的完成。
    Paste_Image.png
    • 请看示例代码
    - (void)dependency
    {
        /**
         假设有A、B、C三个操作,要求:
         1. 3个操作都异步执行
         2. 操作C依赖于操作B
         3. 操作B依赖于操作A
         */
        
        // 1.创建一个队列(非主队列)
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        
        // 2.创建3个操作
        NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"A1---%@", [NSThread currentThread]);
        }];    
        NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"B---%@", [NSThread currentThread]);
        }];
        NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"C---%@", [NSThread currentThread]);
        }];
        
        // 设置依赖
        [operationB addDependency:operationA];
        [operationC addDependency:operationB];
        
        // 3.添加操作到队列中(自动异步执行任务)
        [queue addOperation:operationC];
        [queue addOperation:operationA];
        [queue addOperation:operationB];
    }
    
    NSOperation方式的线程间通信
    • 在前几篇文章中讲了NSThread,GCD方式的线程间通信。下面通过NSOperation的方式进行线程之间的通信。
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        [queue addOperationWithBlock:^{
            // 1.异步下载图片
            NSURL *url = [NSURL URLWithString:@"http://d.hiphotos.baidu.com/image/pic/item/37d3d539b6003af3290eaf5d362ac65c1038b652.jpg"];
            NSData *data = [NSData dataWithContentsOfURL:url];
            UIImage *image = [UIImage imageWithData:data];
            
            // 2.回到主线程,显示图片
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                self.imageView.image = image;
            }];
        }];
    

    通过[NSOperationQueue mainQueue]的方式拿到主线程,通过block将操作封装到主线程中进行操作。

    相关文章

      网友评论

          本文标题:iOS多线程(四)-- NSOperation

          本文链接:https://www.haomeiwen.com/subject/yaizrttx.html