NSOperation基本操作

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=0; i<5; i++) {
19             NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
20         }
21     }];
22     [operation3 addExecutionBlock:^{
23         for (int i=0; i<5; 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=0; i<5; i++) {
48     NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
49     }
50 }
51
52 -(void)test2
53 {
54     for (int i=0; i<5; 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=0; i<10; 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)。

时间: 2024-10-23 11:53:08

NSOperation基本操作的相关文章

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

iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执?行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. (3)最?大并发数的相关?方法 - (NSInteger)maxConcurrentOperationCount;- (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 说明:如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能

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

iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执?行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. (3)最?大并发数的相关?方法 - (NSInteger)maxConcurrentOperationCount;- (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 说明:如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能

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

原文  http://www.cnblogs.com/wendingding/p/3809150.html iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执?行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. (3)最?大并发数的相关?方法 - (NSInteger)maxConcurrentOperationCount; - (void)setMaxConcurrentOperationCount

五:多线程--NSOperation基本操作

一.并发数 (1)并发数:同时执?行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. (3)最?大并发数的相关?方法 - (NSInteger)maxConcurrentOperationCount; - (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 说明:如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能内存多久开多一点,内存少就开少一点. 注意:num

iOS开发——多线程OC篇&amp;(十)多线程NSOperation基本使用

NSOperation基本操作 一.并发数 (1)并发数:同时执?行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. (3)最?大并发数的相关?方法 - (NSInteger)maxConcurrentOperationCount;- (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 说明:如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能内存多久开多一点,内

iOS--多线程之NSOperation

NSOperation 一.NSOperation简单介绍 1.NSOperation简介 ①.简单说明 NSOperation的作?:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操作封装到一个NSOperation对象中 (2)然后将NSOperation对象添加到NSOperationQueue中 (3)系统会?动将NSOperationQueue中的N

文顶顶iOS开发博客链接整理及部分项目源代码下载

文顶顶iOS开发博客链接整理及部分项目源代码下载 网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程却很难找.如果你是初学者,在学习了斯坦福iOS7公开课和跟着文顶顶的博客做项目之后,最快只需要2个月时间,就基本可以独立完成iOS App的开发工作.有经验的开发者也可以在该博客中寻找代码片段进行学习借鉴,必有所收获. 在此也向@文顶顶 表示严重感谢! 由于文顶顶博客博文繁多,每次找文章需要频繁的翻页,

文顶顶博客整理

感谢 文顶顶感谢 ashamp foundation框架 结构体 Foundation框架 字符串 Foundation框架 集合 iOS开发UI篇 Button基础 iOS开发UI篇 手写控件,frame,center和bounds属性 iOS开发UI篇 transframe属性(形变) iOS开发UI篇 简单的浏览器查看程序 iOS开发UI篇 懒加载 ios开发UI篇 安装苹果官方文档和Xcode模拟器 OC语言BLOCK和协议 iOS开发UI篇 九宫格坐标计算 iOS开发UI篇 字典转模型

iOS开发多线程篇—单例模式(ARC)

iOS开发多线程篇—单例模式(ARC) - 文顶顶 原文  http://www.cnblogs.com/wendingding/p/3808641.html iOS开发多线程篇—单例模式(ARC) 一.简单说明: 设计模式:多年软件开发,总结出来的一套经验.方法和工具 java中有23种设计模式,在ios中最常用的是单例模式和代理模式. 二.单例模式说明 (1)单例模式的作用 :可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源. (