iOS开发多线程篇—NSOperation基本操作

一、并发数
(1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3
(2)最大并发数:同一时间最多只能执行的任务的个数。
(3)最⼤大并发数的相关⽅方法
- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 
说明:如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能内存多久开多一点,内存少就开少一点。
注意:num的值并不代表线程的个数,仅仅代表线程的ID。
提示:最大并发数不要乱写(5以内),不要开太多,一般以2~3为宜,因为虽然任务是在子线程进行处理的,但是cpu处理这些过多的子线程可能会影响UI,让UI变卡。
 
二、队列的取消,暂停和恢复

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

- (void)cancelAllOperations;

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

(2)暂停和恢复队列

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

- (BOOL)isSuspended; //当前状态

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

(1)设置NSOperation在queue中的优先级,可以改变操作的执⾏优先级

- (NSOperationQueuePriority)queuePriority;
- (void)setQueuePriority:(NSOperationQueuePriority)p;

(2)优先级的取值

NSOperationQueuePriorityVeryLow = -8L,

NSOperationQueuePriorityLow = -4L,

NSOperationQueuePriorityNormal = 0,

NSOperationQueuePriorityHigh = 4,

NSOperationQueuePriorityVeryHigh = 8

说明:优先级高的任务,调用的几率会更大。

四、操作依赖

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

[operationB addDependency:operationA]; // 操作B依赖于操作

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

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

(3)代码示例

  1. #import "YYViewController.h"
  2.  
  3. @interface YYViewController ()
  4.  
  5. @end
  6.  
  7. @implementation YYViewController
  8.  
  9. - (void)viewDidLoad
  10. {
  11. [super viewDidLoad];
  12.  
  13. //创建NSInvocationOperation对象,封装操作
  14. NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
  15. NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
  16. //创建对象,封装操作
  17. NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
  18. for (int i=; i<; i++) {
  19. NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
  20. }
  21. }];
  22. [operation3 addExecutionBlock:^{
  23. for (int i=; i<; i++) {
  24. NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
  25. }
  26. }];
  27.  
  28. //设置操作依赖
  29. //先执行operation2,再执行operation1,最后执行operation3
  30. [operation3 addDependency:operation1];
  31. [operation1 addDependency:operation2];
  32.  
  33. //不能是相互依赖
  34. // [operation3 addDependency:operation1];
  35. // [operation1 addDependency:operation3];
  36.  
  37. //创建NSOperationQueue
  38. NSOperationQueue * queue=[[NSOperationQueue alloc]init];
  39. //把操作添加到队列中
  40. [queue addOperation:operation1];
  41. [queue addOperation:operation2];
  42. [queue addOperation:operation3];
  43. }
  44.  
  45. -(void)test1
  46. {
  47. for (int i=; i<; i++) {
  48. NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
  49. }
  50. }
  51.  
  52. -(void)test2
  53. {
  54. for (int i=; i<; i++) {
  55. NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
  56. }
  57. }
  58.  
  59. @end
 
打印查看:
A做完再做B,B做完才做C。
注意:一定要在添加之前,进行设置。
提示:任务添加的顺序并不能够决定执行顺序,执行的顺序取决于依赖。使用Operation的目的就是为了让开发人员不再关心线程。
 
 
5.操作的监听

可以监听一个操作的执行完毕

- (void (^)(void))completionBlock;
- (void)setCompletionBlock:(void (^)(void))block;

代码示例

第一种方式:可以直接跟在任务后面编写需要完成的操作,如这里在下载图片后,紧跟着下载第二张图片。但是这种写法有的时候把两个不相关的操作写到了一个代码块中,代码的可阅读性不强。

  1. #import "YYViewController.h"
  2.  
  3. @interface YYViewController ()
  4.  
  5. @end
  6.  
  7. @implementation YYViewController
  8.  
  9. - (void)viewDidLoad
  10. {
  11. [super viewDidLoad];
  12.  
  13. //创建对象,封装操作
  14. NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
  15. NSLog(@"-operation-下载图片-%@",[NSThread currentThread]);
  16. //.....下载图片后继续进行的操作
  17. NSLog(@"--接着下载第二张图片--");
  18. }];
  19.  
  20. //创建队列
  21. NSOperationQueue *queue=[[NSOperationQueue alloc]init];
  22. //把任务添加到队列中(自动执行,自动开线程)
  23. [queue addOperation:operation];
  24. }
  25.  
  26. @end

第二种方式:

  1. #import "YYViewController.h"
  2.  
  3. @interface YYViewController ()
  4.  
  5. @end
  6.  
  7. @implementation YYViewController
  8.  
  9. - (void)viewDidLoad
  10. {
  11. [super viewDidLoad];
  12.  
  13. //创建对象,封装操作
  14. NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
  15. for (int i=; i<; i++) {
  16. NSLog(@"-operation-下载图片-%@",[NSThread currentThread]);
  17. }
  18. }];
  19.  
  20. //监听操作的执行完毕
  21. operation.completionBlock=^{
  22. //.....下载图片后继续进行的操作
  23. NSLog(@"--接着下载第二张图片--");
  24. };
  25.  
  26. //创建队列
  27. NSOperationQueue *queue=[[NSOperationQueue alloc]init];
  28. //把任务添加到队列中(自动执行,自动开线程)
  29. [queue addOperation:operation];
  30. }
  31.  
  32. @end

打印查看:

说明:在上一个任务执行完后,会执行operation.completionBlock=^{}代码段,且是在当前线程执行(2)。

iOS开发多线程篇—NSOperation基本操作的更多相关文章

  1. iOS开发多线程篇—NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  2. iOS开发——多线程篇——NSOperation(基于GCD多线程编程),下载图片并合成新图片

    一.NSOperation的基本概念1.简介NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperatio ...

  3. iOS开发多线程篇 10 —NSOperation基本操作

    iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...

  4. iOS开发多线程篇 09 —NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  5. iOS开发多线程篇—自定义NSOperation

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

  6. iOS开发多线程篇 11 —自定义NSOperation

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

  7. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  8. iOS开发多线程篇—线程安全

    iOS开发多线程篇—线程安全 一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块 ...

  9. iOS 开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

随机推荐

  1. Leetcode: Assign Cookies

    Assume you are an awesome parent and want to give your children some cookies. But, you should give e ...

  2. js作用域学习

    代码解析至少分两步 1):查找var,function参数例如下面这个例子 a= 未定义 fn1={alert(2)}函数的话,是整个整体 2):逐行读代码:类似=+-%*等都是表达式,表达式可以改变 ...

  3. STL之容器(1)

    STL容器类的模板 容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和 ...

  4. PHP二维数组提取函数----把不需要的数据剔除

    首先说明一些这个函数的应用场景,比如说你得到的数据是个二维数组,里面的很多成员其实是不必要的,比如说api调用后不必要给别人返回一些用不到的垃圾数据吧,如下是代码. <?php /* * del ...

  5. tomcat部署https

    在server.xml配置文件中增加证书位置跟密码: <Connector port="443" protocol="org.apache.coyote.http1 ...

  6. Git入门教程

    参考文献: 1. Pro Git 2. Git教程 3. Git教程 4. 图解Git

  7. RecyclerView使用总结

    遇到的异常: java.lang.ExceptionInInitializerError静态块初始化异常 NetworkOnMainThreadException访问网线不能在主线程中进行 我的参考资 ...

  8. FusionCharts或其它flash的div图层总是浮在最上层的问题

    div的图层由div的style中的z-index来决定,z-index是层垂直屏幕的坐标,0最小,越大的话位置越靠上. 由于FusionCharts的图表都放在div中,如果页面还有其他的div,将 ...

  9. 20个Linux服务器安全强化建议(二)

    接上文,继续介绍一些Linux服务器的安全配置. #6.强密码策略.   当我们使用 useradd.usermod 命令创建或维护用户账号时,确保始终应用强密码策略.例如,一个好的密码至少包括8个字 ...

  10. Codeforces Round #316 (Div. 2) D. Tree Requests dfs序

    D. Tree Requests time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...