一、并发数
  (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. JavaEE JDBC 了解数据库连接池

    了解数据库连接池 @author ixenos 数据库连接是有限的资源,如果用户需要离开应用一段时间,那么他占用的连接就不应该保持开放状态: 另一方面,每次查询都获取连接并在随后关闭它的代价也很高. ...

  2. HDU 1426 dancing links解决数独问题

    题目大意: 这是一个最简单的数独填充题目,题目保证只能产生一种数独,所以这里的初始9宫格较为稠密,可以直接dfs也没有问题 但最近练习dancing links,这类数据结构解决数独无疑效率会高很多 ...

  3. Hibernate 批处理(batch inserts, updates and deletes)

    总结:hibernate在进行批量处理不给力的主要原因就是Session中存在缓存,而hibernate的机制就是通过session中的一级缓存去同步数据库,所以当进行批量处理时,缓存中保存的数据量很 ...

  4. sencha architect开发sencha touch应用注意事项

    以下说明文字针对sencha architect v2.2.2 一.无限期试用 1. 下载地址: http://www.sencha.com/products/architect/download/ ...

  5. SpringBoot配置Bean的两种方式--注解以及配置文件

    一.注解方式 编写实体类: package com.example.bean; import org.springframework.boot.context.properties.Configura ...

  6. CF788E:New task

    n个数字中,每个数有数字A和属性B,每次操作将某个点x的属性B改变为0或1,求满足这样要求的子序列的个数: 下标a<b<c<d<e,而Aa<=Ab=Ac=Ad>=A ...

  7. MySQL Slow Log慢日志分析【转】

    如果你的MySQL出现了性能问题,第一个需要“诊断”的就是slow log(慢日志)了. slow log文件很小,使用more less等命令就足够了.如果slow log很大怎么办?这里介绍MyS ...

  8. 几道hash题

    1: UVa 10887 - Concatenation of Languages map 可以做 ,但是输入实在恶心,有空串之类的HASH模板: int Hash(char *s){   int s ...

  9. Spring Boot应用的启动和停止(Spring Boot应用通过start命令启动)

    Spring Boot,作为Spring框架对“约定优先于配置(Convention Over Configuration)”理念的最佳实践的产物,它能帮助我们很快捷的创建出独立运行.产品级别的基于S ...

  10. DELPHI最新的产品路线图

    1)根据众多像您一样的客户要求,我们改为一年一个重大版本及更多更新.这个计划回到一年发布周期并提供额外的2或3个包含附加功能及支持期间发布的新版操作系统的更新. 2)在 RAD Studio  10. ...