1 最大并发数

最大并发数:同一时间最多只能执行的任务的个数。
最⼤大并发数的相关⽅方法

- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 

说明:如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的。
提示:最大并发数不要开太多(在 5 以内),一般以2~3为宜,因为虽然任务是在子线程进行处理的,但子线程会占系统内存, 同时cpu处理这些过多的子线程可能会影响UI,让UI变卡, 影响用户体验.
代码实例:

- (void)blockOperation3{//创建全局队列(实现异步并发执行)NSOperationQueue *queue = [[NSOperationQueue alloc] init];//指定最大并发数,//当最大并发数为1的时候,队列变成了串行队列queue.maxConcurrentOperationCount = 3;//创建任务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]);}];NSBlockOperation *operation5 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"下载图片5 --- %@", [NSThread currentThread]);}];//将任务添加到队列中[queue addOperation:operation1];[queue addOperation:operation2];[queue addOperation:operation3];[queue addOperation:operation4];[queue addOperation:operation5];
}


2 添加依赖

- (void)blockOperation4{//创建全局队列(实现异步并发执行)NSOperationQueue *queue = [[NSOperationQueue alloc] init];//创建任务NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"下载图片1 --- %@", [NSThread currentThread]);}];NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"下载图片2 --- %@", [NSThread currentThread]);}];NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"下载图片3 --- %@", [NSThread currentThread]);}];[operation1 addDependency:operation3];// 任务1 依赖 任务3 (执行完任务3 才能执行 任务1)[operation3 addDependency:operation2];// 任务3 依赖 任务2 (执行完任务2 才能执行 任务3)//将任务添加到队列中[queue addOperation:operation1];[queue addOperation:operation2];[queue addOperation:operation3];
}


注意:
NSOperation 之间可以设置依赖来保证执行顺序,⽐如一定要让操作3执行完后,才能执行操作1,可以像下面这么写

[operation1 addDependency:operation3]; // 操作1依赖于操作3

可以在不同 queue 的 NSOperation 之间创建依赖关系

注意:不能循环依赖(不能A依赖于B,B又依赖于A)

3 进程通信

- (void)sendMessage{//创建全局队列(实现异步并发执行)NSOperationQueue *queue = [[NSOperationQueue alloc] init];//直接向队列中添加任务[queue addOperationWithBlock:^{//耗时操作NSLog(@"下载图片1 --- %@", [NSThread currentThread]);//回到主线程[[NSOperationQueue mainQueue] addOperationWithBlock:^{//刷新UI操作}];}];
}

总结:回到主线程的方法:

//回到主线程[self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>]dispatch_sync(dispatch_get_main_queue(), ^{//刷新UI操作});[[NSOperationQueue mainQueue] addOperationWithBlock:^{//刷新UI操作}];

取消 暂停 重启队列

(1)取消队列的所有操作

 - (void)cancelAllOperations;

提⽰:也可以调用NSOperation的- (void)cancel⽅法取消单个操作

(2)暂停和恢复队列

// YES代表暂停队列,NO代表恢复队列
- (void)setSuspended:(BOOL)b;
- (BOOL)isSuspended; //当前状态

(3)暂停和恢复的适用场合:在tableview界面,开线程下载远程的网络界面,对UI会有影响,使用户体验变差。那么这种情况,就可以设置在用户操作UI(如滚动屏幕)的时候,暂停队列(不是取消队列),停止滚动的时候,恢复队列。

//取消队列中所有任务(收到内存警告的时候)
[queue cancelAllOperations];//暂停队列中的所有任务(开始拖动操作等)
[queue setSuspended:YES];//恢复队列中的所有任务(结束拖动操作等)
[queue setSuspended:NO];

监听线程执行

//可以监听一个操作的执行完毕
- (void (^)(void))completionBlock;
- (void)setCompletionBlock:(void (^)(void))block;

实现GCD队列组的功能:

- (void)groupOperation{//创建全局队列(实现异步并发执行)NSOperationQueue *queue = [[NSOperationQueue alloc] init];//创建任务NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"下载图片1 --- %@", [NSThread currentThread]);}];[operation1 addExecutionBlock:^{NSLog(@"下载图片2 --- %@", [NSThread currentThread]);}];//当线程执行完成后,调用[operation1 setCompletionBlock:^{//合并图片1 和 2NSLog(@"合并图片1 和 2 --- %@", [NSThread currentThread]);}];//将任务添加到队列中[queue addOperation:operation1];
}

转载于:https://www.cnblogs.com/xiaocai-ios/p/7779774.html

ios 多线程 -- NSOperation 常用方法相关推荐

  1. ios多线程 -- NSOperation 简介

    NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: 1)先 ...

  2. iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)

    2017-07-08 remember17 Cocoa开发者社区 目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 ...

  3. iOS多线程:『NSOperation、NSOperationQueue』详尽总结

    2019独角兽企业重金招聘Python工程师标准>>> iOS多线程:『NSOperation.NSOperationQueue』详尽总结 转载: 原地址https://www.ji ...

  4. iOS面试题(二十五)多线程 --NSOperation和NSOperationQueueNSThread锁机制

    7.多线程 GCD(使用最多) NSOperation/NSOperationQueue(AFNetworking源码中所有网络请求任务都封装到NSOperation,提交到operationQueu ...

  5. iOS 多线程的四种技术方案

    iOS 多线程的四种技术方案 image pthread 实现多线程操作 代码实现: void * run(void *param) {for (NSInteger i = 0; i < 100 ...

  6. IOS多线程开发详解

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

  7. iOS多线程拾贝------操作巨人编程

    iOS多线程拾贝------操作巨人编程 多线程 基本 实现方案:pthread - NSThread - GCD - NSOperation Pthread 多平台,可移植 c语言,要程序员管理生命 ...

  8. IOS 多线程的一些总结

    IOS 多线程 有三种主要方法 (1)NSThread (2)NSOperation (3)GCD 下面简单介绍这三个方法 1.NSThread 调用方法如下: 如函数需要输入参数,可从object传 ...

  9. ios多线程开发的常用三种方式

    ios多线程开发的常用三种方式 1.NSThread 2.NSOperationQueue 3.GCD NSThread: 创建方式主要有两种: [NSThread detachNewThreadSe ...

最新文章

  1. Android 用Animation-list实现逐帧动画
  2. 构建伪Update服务器工具isr-evilgrade
  3. Pat甲级 1002 A+B for Polynomials
  4. 自动打开WINDWOS远程控制的注册表文件
  5. 四十六、深入Java的网络编程(下篇)
  6. Vue组件通信原理剖析(一)事件总线的基石 $on和$emit
  7. 关于Exchange管理控制台报“您的权限不足,无法此查看数据”的解决办法
  8. (需求实战_03)_shell脚本 sftp协议下载文件
  9. python画精美图案_Python语言的魅力------完美图案
  10. P1047 [NOIP2005 普及组] 校门外的树(python3实现)
  11. 第3章 系统设计和架构设计【扩胸运动,有容乃大】
  12. 【转载】HBase实践 | 使用Spark分析云HBase的数据
  13. TensorFlow学习笔记——自然语言处理
  14. 计算机一级考试自测题,计算机一级B考试自测题
  15. 搜狗输入法弹出搜狗新闻的解决办法
  16. 梯度下降学习率的设定策略
  17. 手机QQ2010(BlackBerry)Beta1公测
  18. 开发工具之VisualStudio
  19. 匿怨而友其人,左丘明耻之,丘亦耻之。我不是圣人,我假装什么都没发生。
  20. matlab图像文件的格式

热门文章

  1. Android初级第一讲---Android开发环境的配置
  2. SharePoint配置和自定义Content Query Web Part
  3. linux 基础命令总结
  4. 前端vue显示柱状图_Vue接入Echarts 显示柱状图饼图
  5. python代码规范化_最流行的Python代码规范
  6. mysql性能调优与架构设计 51cto_MySQL 数据库性能优化之表结构优化
  7. 如何一站式快速构建企业全场景数据库管理平台?
  8. 2020年7月编程语言排行榜来喽,R编程语言创历史最高纪录
  9. ACL 2018 收录论文 | 如何高效提炼有效信息?
  10. 温商机器人企业_7家温商企业上榜“中国企业500强”