NSInvocationOperation

// 基于一个对象和selector来创建操作。如果你已经有现有的方法来执行需要的任务,就可以使用这个类

NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
   
    // 如果我们想在一个NSOperation执行完毕后做一些事情,就调用NSOperation的setCompletionBlock方法来设置想做的事情
    [op setCompletionBlock:^{
        NSLog(@"完成");
    }];
   
    //    2.开始执行任务(同步执行)
   
    // 一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的。

[op start];

NSBlockOperation

//  能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成
    NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@",[NSThread currentThread]);
        
        NSLog(@"第一个操作");
    }];
    
    // 通过addExecutionBlock方法添加block操作,开启多个线程,三个线程
    [op addExecutionBlock:^{
        
        NSLog(@"%@",[NSThread currentThread]);
        
        NSLog(@"第二个操作");
    }];
    
    [op addExecutionBlock:^{
        
        NSLog(@"%@",[NSThread currentThread]);
        
        NSLog(@"第三个操作");
    }];
    
    [op start];

NSOperationQueue-   一个操作序列

//NSOperation是基于GCD的,把GCD的block封装成opertion,NSOperationQueue是全局队列封装
    //将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的。
   
    //创建一个操作队列
    NSOperationQueue * queue = [[NSOperationQueue alloc] init];
   
    NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
   
    NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
       
        NSLog(@"op2 - %@",[NSThread currentThread]);
    }];
   
    //添加NSOperation到NSOperationQueue中
    //NSOperation添加到queue之后,通常短时间内就会得到运行。
    //    [queue addOperation:op];
    //    [queue addOperation:op2];
   
    //    waitUntilFinished yes 操作完成后执行下面的代码 no 先执行下面的代码
   
    //添加一个block形式的operation
    [queue addOperationWithBlock:^{
       
        NSLog(@"op3 - %@",[NSThread currentThread]);
       
    }];
   
    [queue addOperations:@[op,op2] waitUntilFinished:NO];

//最大并发数,这个功能NSOperation比较常用
   
    queue.maxConcurrentOperationCount = 2;
   
    for (NSInteger i = 0; i < 10; i++) {
       
        NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
       
        [queue addOperation:op];
    }

NSOperationQueue的依赖关系

self.queue = [[NSOperationQueue alloc] init];
    
    NSInvocationOperation * op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
    //设置优先级,数据量少看不出
    op1.queuePriority = -4;

NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"解压图片包");
    }];
    op2.queuePriority = 0;

NSBlockOperation * op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"观看漫画");
    }];
    op3.queuePriority = 4;
    
    //添加NSOperation的依赖对象
//    [op2 addDependency:op1];
//    [op3 addDependency:op2];
    
    //注意:不能创建环形依赖,如A依赖B,B依赖A,这是错误的
    //    [op1 addDependency:op3];
    
    [self.queue addOperations:@[op1,op2,op3] waitUntilFinished:YES];

//挂起状态
    self.queue.suspended = !self.queue.suspended;
// 不过暂停一个queue不会导致正在执行的operation在任务中途暂停,只是简单地阻止调度新Operation执行。

// 取消queue中所有的操作
    [self.queue cancelAllOperations];

//NSOperation 线程之间的通信

[self.queue addOperationWithBlock:^{
       
        NSLog(@"%@",[NSThread currentThread]);
        NSLog(@"下载图片");
       
        //获取主队列
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
           
            NSLog(@"%@",[NSThread currentThread]);
            NSLog(@"更新UI");
           
        }];
    }];

NSOperation与GCD的区别

/**
 *  GCD -- (iOS4.0)多线程解决方案
    将任务(block)添加到队列(串行,并行(全局队列)),指定执行任务的方法。(同步,异步)
    拿到dispatch_get_main_queue,线程之间的通信

NSOperation -- (iOS2.0)  (后经苹果改造)
 
    将操作添加到队列里
    [NSOperationQueue mainQueue]  获取主队列,将任务添加到主队列,就会在主线程中执行
    NSOperation可以设置最大并发数(用GCD处理,比较麻烦)
    可以暂停可以继续,也就是挂起操作
    取消所有的任务
    设置依赖关系
 */

最新文章

  1. C语言 &#183; 数位分离
  2. 一鼓作气 博客--第二篇 note2
  3. 摇一摇js 实现
  4. 【转】编译Lua5.3.0的iOS静态库
  5. 半小时学会上传本地项目到github
  6. APP,webapp 设计相关资料汇集区
  7. Windows批处理(cmd/bat)常用命令小结
  8. linux下ifconfig, DNS以及route配置
  9. [翻译]初识SQL Server 2005 Reporting Services Part 2
  10. 云计算之路-阿里云上:14:20-14:55博客后台2台服务器都CPU 100%引发的故障
  11. tyvj4865 天天和树tree
  12. python day06
  13. LOJ2721 [NOI2018] 屠龙勇士 【扩展中国剩余定理】
  14. Python之进程 3 - 进程池和multiprocess.Poll
  15. ZooKeeper概念与应用
  16. Redis 入门 安装 命令
  17. php 7 新特性整理小结
  18. js数组对象--数据格式的转换(字符串,对象的取值与赋值)
  19. C#取得Web程序和非Web程序的根目录的N种取法
  20. javascript和jquery如何判断元素是否存在最佳。

热门文章

  1. 【Swift学习】Swift编程之旅(三)
  2. Visual Studio开发Cordova应用示例
  3. C# 模拟提交 Form表单的数据
  4. 如何使用C#创建WebService
  5. NoSQL数据库介绍
  6. Titanium Studio下载地址
  7. Scalaz(11)- Monad:你存在的意义
  8. 基础-WeakReference
  9. coreseek (sphinx)+ Mysql + Thinkphp搭建中文搜索引擎详解
  10. static的用法