一、并发数
  (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)。

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的目的就是为了让开发人员不再关心线程。
 
五.操作的监听

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

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

  代码示例

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

        代码的可阅读性不强。

 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 第二种方式:
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 }

  打印查看:

    

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

五:多线程--NSOperation基本操作的更多相关文章

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

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

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

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

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

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

  4. {python--GIL锁}一 介绍 二 GIL介绍 三 GIL与Lock 四 GIL与多线程 五 多线程性能测试

    python--GIL锁 GIL锁 本节目录 一 介绍 二 GIL介绍 三 GIL与Lock 四 GIL与多线程 五 多线程性能测试 一 背景知识 ''' 定义: In CPython, the gl ...

  5. 多线程 (五)NSOperation

    NSOperation是对GCD的分装,OC语言,更简单方便 NSOperation和NSOperationQueue一起使用也能实现多线程编程 基本步骤: 将操作封装到一个NSOperation对象 ...

  6. IOS高级开发之多线程(五)NSOperation 2

    接着看NSOperation.NSOperationQueue线程间的通信: 应用场景:比如我们经常把一些耗时的操作比如下载图片放在子线程,那么当这个完成之后,我们就需要回到主线程,这个时候就需要用到 ...

  7. iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信

    一.NSOperation NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加 ...

  8. 3.多线程NSOperation

    1.NSOperation的基本操作 使用NSOperation的两个子类,NSInvocationOperation 和 NSBlockOperation 创建操作,然后将操作添加到队列中去执行 / ...

  9. iOS多线程 NSOperation的用法

    上一篇写了 GCD 的使用,接下来就了解一下 NSOperation ,NSOperation是苹果对 GCD 的 OC 版的一个封装,但是相对于GCD来说可控性更强,并且可以加入操作依赖. NSOp ...

随机推荐

  1. POJ2421 Constructing Roads

    Constructing Roads 这道题很水,就是一个裸的最小生成树,最不过把已经连接的节点的值再设为0. 代码: #include<cstdio> #include<cstri ...

  2. POJ-1067取石子游戏,威佐夫博弈范例题/NYOJ-161,主要在于这个黄金公式~~

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K              Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取 ...

  3. 使用dd命令快速生成大文件或者小文件的方法

    使用dd命令快速生成大文件或者小文件的方法     转载请说明出处:http://blog.csdn.net/cywosp/article/details/9674757     在程序的测试中有些场 ...

  4. [BZOJ2120][BZOJ2453]数颜色

    [BZOJ2120]数颜色 试题描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中 ...

  5. bzoj5090组题 分数规划

    组题 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 542  Solved: 114[Submit][Status][Discuss] Descript ...

  6. 最大和(codevs 1648)

    题目描述 Description N个数围成一圈,要求从中选择若干个连续的数(注意每个数最多只能选一次)加起来,问能形成的最大的和. 输入描述 Input Description 第一行输入N,表示数 ...

  7. POJ1256 Anagram

    Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %lld & %llu Submit Status Descript ...

  8. File类 判断功能和获取功能

    package cn.zmh.File; import java.io.File; /* * * File判断功能 * * */ public class FileDemo3判断功能 { public ...

  9. 分享一下然让显卡满血复活的小技巧(GTX)

    分享一下然让显卡满血复活的小技巧 笔者在玩大型游戏卡顿15fps下载如下操作 GTX950玩大型游戏都不会卡帧率稳定在30fps 下载GeForce Experience下载更新最新驱动 下载如下程序 ...

  10. IOS开发 AFN和ASI

    做项目有一段时间了,项目过程中处理网络请求难免的,而对于选择第三方来处理网络请求肯定是个明智的选择! AFNetworking和ASIHTTPRequest   这两个第三方该如何选择       我 ...