简介


  • 通过NSOperation与NSOperationQueue的组合也能实现多线程
  • 通常将任务封装成NSOperation对象,并将对象添加到NSOperationQueue中实现

NSOperation


  • NSOperation是一个抽象类,不能用来直接封装操作,通常使用它的子类来封装操作

  • 若不将NSOperation对象添加到NSOperationQueue中,操作只会在当前线程执行,且需要手动开始执行操作

  • NSoperation的子类

    • NSInvocationOperation

      //创建操作
      NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
      //开始执行操作
      [operation start];
    • NSBlockOperation(当操作数大于1时,异步执行)

      //创建操作
      NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
      //操作封装的任务代码
      }];
      //添加操作
      [operation addExecutionBlock:^{
      //操作封装的任务代码
      }];
      //开始执行操作
      [operation start];
    • 自定义子类的步骤

      • 重写- (void)main方法,在该方法中封装需要执行的操作
      • 在- (void)main方法中,需要自己建立自动释放池(原因:若是异步操作,无法访问主线程的自动释放池)
      • 通过检查cancelled等属性,来判断操作的状态,执行相应的操作
  • 设置操作完成时的回调

    //创建操作
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
    //任务代码
    }];
    //设置回调
    operation.completionBlock = ^{
    //操作完成时执行的代码
    };

NSOperationQueue


  • 作用

    • 容纳需要异步执行的操作
    • 系统会自动执行NSOperationQueue中的操作,不需要手动启动
  • NSOperationQueue的相关操作
    • 创建操作队列

      • [[NSOperationQueue alloc] init]
    • 获取主操作队列
      • + (NSOperationQueue *)mainQueue
    • 获取当前操作队列
      • + (nullable NSOperationQueue *)currentQueue
    • 往队列中添加操作
      • - (void)addOperation:(NSOperation *)op
      • - (void)addOperationWithBlock:(void (^)(void))block
    • 设置最大并发操作数
      • - setMaxConcurrentOperationCount:(NSInteger)count
      • 若并发操作数为1,则为串行队列
    • 暂停/启动队列中的任务
      • - setSuspended:(BOOL)b
    • 取消队列中的任务
      • - (void)cancelAllOperations
      • 等到正在执行的任务执行完毕,队列才会被挂起

实现多线程的步骤


  • 创建操作队列

    NSOperationQueue *queue = [[NSOperationQueue alloc] init]
  • 往队列中添加操作

    /**
    方法一
    */
    //创建操作
    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil] //download为操作封装的任务方法
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
    //任务代码
    }];
    //添加操作
    [queue addOperation:operation1];
    [queue addOperation:operation2]; /**
    方法二
    */
    //添加操作
    [queue addOperationWithBlock:^{
    //操作封装的任务
    }];

操作依赖


  • 作用

    • 建立操作之间的执行顺序关系
    • 操作依赖是面向操作的,可以跨队列建立操作之间的依赖关系
    • 若要建立操作之间的依赖关系,必须在操作被添加到队列之前建立
  • 建立操作依赖的步骤
    • 创建操作队列

      NSOperationQueue *queue = [[NSOperationQueue alloc] init]
    • 添加操作

      NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
      //任务1代码
      }];
      NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
      //任务2代码
      }];
    • 建立依赖关系(必须在操作被添加到队列之前)

      [operation1 addDependency:operation2];
    • 将操作添加到队列

      [queue addOperation:operation1];
      [queue addOperation:operation2];

线程之间的通信


  • 从主线程到子线程

    • 从主线程到子线程的切换,通常是系统自动完成的,只需要将操作添加到队列中,系统就会根据实际需要,是否切换到子线程中执行操作
  • 从子线程到主线程
    • 将需要执行的操作,添加到主操作队列中即可(该操作将运行在主runLoop的common模式下)

      [[NSOperationQueue mainQueue] addOperationWithBlock:^{
      //需要在主线程中执行的任务代码
      }];

最新文章

  1. jquery动态合并表格行
  2. CentOS_7.2编译安装PHP_5.6.20添加扩展模块
  3. nginx 基本操作
  4. NHibernate使用Access数据库的配置问题
  5. jquery仿淘宝规格颜色选择效果
  6. 【笔记】jquery hover的用法
  7. HTTP协议之chunk编码(分块传输编码
  8. 从Unity学UE(一)之蓝图类的使用----制作一个可控灯光
  9. Zend studio 12.5.1安装aptana
  10. hdu 5745 La Vie en rose DP + bitset优化
  11. Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)
  12. linux 下执行.sh文件总是提示permission denied
  13. SRM 628 D1L3:DoraemonPuzzleGame,math,后市展望,dp
  14. Android使用开源项目Xutils实现多线程下载文件
  15. 基于UDP协议的网络编程
  16. icheck样式绑定与翻页保持
  17. iOS字典转字符串方法
  18. iOS逆向开发(1):基础工具 | ssh | scp | socat
  19. Spring之Bean的生命周期详解
  20. 实验楼-Git实战教程

热门文章

  1. 菜鸟学Windows Phone 8开发(4)——设置应用程序样式
  2. Kafka集群部署
  3. SQL Server技术问题之游标优缺点
  4. SpringMVC——类型转换和格式化、数据校验、客户端显示错误消息
  5. P6 EPPM Installation and Configuration Guide 16 R1 April 2016
  6. 译:什么是ViewData的, ViewBag和TempData? - MVC为当前和后续请求之间传递数据的三种方法
  7. WCF开发框架之插件化应用模式升级
  8. Azure开发者任务之二:Cloud Service项目添加到ASP.Net Web中
  9. ArrayList集合
  10. Oracle 查询并删除重复记录的SQL语句