ios多线程操作(十一)—— NSOperation的高级操作

来源:互联网 发布:如何下载excel2007软件 编辑:程序博客网 时间:2024/06/05 17:37
NSOperation可以调用start方法来执行任务,但默认是同步执行的,如果将NSOperation添加到      NSOperationQueue(操作队列)中,系统会自动异步执行队列中的操作。
     NSOperationQueue中可以对操作进行取消,暂停和恢复
     取消函数为: 
[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. - (void)cancelAllOperations;  
    也可以调用NSOperation的cancel方法来取消单个操作 
[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. - (void)cancel;  
  队列中有个属性 suspended ,通过设置该BOOL值的YES或NO来暂停和恢复操作。
  操作也有优先级,通过设置NSOperation在队列中的优先级,可以改变操作的执行优先级,NSOperation中有个属性queuePriority,
可以通过该属性来设置,优先级的取值都有
    NSOperationQueuePriorityVeryLow = -8L,
          NSOperationQueuePriorityLow = -4L,
          NSOperationQueuePriorityNormal = 0,
          NSOperationQueuePriorityHigh = 4,
          NSOperationQueuePriorityVeryHigh = 8
     NSOperation中具备一个非常常用的属性,该属性在头文件中得定义如下
[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @property (copyvoid (^completionBlock)(void) NS_AVAILABLE(10_64_0);  

通过该属性我们可以进行操作的监听,当该操作执行完毕后,就会执行completionBlock中的块代码,例如:
[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. // 新建一个块操作  
  2.     NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{  
  3.         [NSThread sleepForTimeInterval:3.0];  
  4.         NSLog(@"%@ , come here",[NSThread currentThread]);  
  5.     }];  
  6.     // 新建一个操作队列  
  7.     NSOperationQueue *queue = [[NSOperationQueue alloc] init];  
  8.     // 将操作添加到队列  
  9.     [queue addOperation:op];  
  10.     // 监听该操作,当完成该操作后执行的代码  
  11.     [op setCompletionBlock:^{  
  12.         [[NSOperationQueue mainQueue] addOperationWithBlock:^{  
  13.             NSLog(@"%@,here",[NSThread currentThread]);  
  14.         }];  
  15.   
  16.     }];  

效果如下:


无论执行什么操作,块代码总会在最后执行!     
       NSoperation之间可以设置依赖来保证执行顺序,例如:
[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{  
  2.         NSLog(@"用户登录 %@", [NSThread currentThread]);  
  3.     }];  
  4.     NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{  
  5.         NSLog(@"付费 %@", [NSThread currentThread]);  
  6.     }];  
  7.     NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{  
  8.         [NSThread sleepForTimeInterval:1.0f];  
  9.         NSLog(@"下载 %@", [NSThread currentThread]);  
  10.     }];  
  11.     NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{  
  12.         NSLog(@"更新UI %@", [NSThread currentThread]);  
  13.     }];  
  14.      
  15.     /* "指定任务之间的依赖关系" - GCD使用的同步任务(不会开线程) 
  16.      NSOperation 会开线程,但是依然能够保证操作的执行顺序,并发效率会更好! 
  17.      依赖关系,是可以跨队列的 */  
  18.       
  19.     // 付费之前需要登录  
  20.     [op2 addDependency:op1];  
  21.     // 下载之前需要付费  
  22.     [op3 addDependency:op2];  
  23.     // 更新UI之前需要完成下载  
  24.     [op4 addDependency:op3];  
  25.      
  26.     // 注意:在指定依赖关系时,注意不要出现循环依赖  
  27.     // waitUntilFinished == NO,异步的 YES 是同步的  
  28.     [self.queue addOperations:@[op1, op2, op3] waitUntilFinished:NO];  
  29.       
  30.     // 更新UI的操作,应该由主队列来调度  
  31.     [[NSOperationQueue mainQueue] addOperation:op4];  
  32.      
  33.     NSLog(@"come here");  


执行效果如下:
0 0
原创粉丝点击