IOS - NSOperation详细总结

1-NSOperation的作用

NSOperation类本身并不能实现什么,但是可以配合两个子类NSInvocationOperation、NSBlockOperation和NSOperationQueue实现多线程。
注意点:
1.如果NSInvocationOperation和NSBlockOperation两个子类不配合NSOperationQueue队列使用,会默认让在主线程中同步执行。
2.只有NSOperation添加到NSOperationQueue中才会开启新线程异步操作。
3.NSOperation添加到NSOperationQueue队列后,会自动执行操作,自动开启线程。
(1)NSOperation不添加到队列中,在主线程中执行,以NSInvocationOperation 为例,NSBlockOperation同理 :

// 创建一个任务
NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self 
selector:@selector(operation) 
object:nil];
// 执行操作
[operation start];

(2)添加到队列中执行

NSInvocationOperation *A=[[NSInvocationOperation alloc]initWithTarget:self 
selector:@selector(operation) 
object:nil];
NSBlockOperation *B=[NSBlockOperation blockOperationWithBlock:^{
   NSLog(@"B%@",[NSThread currentThread] );
 }];
 NSOperationQueue *queue=[[NSOperationQueue alloc] init];
 [queue addOperation:A];
 [queue addOperation:B];
 // 直接添加block
 [queue addOperationWithBlock:^{
  NSLog(@"addOperationWithBlock执行中。。。%@",
  [NSThread currentThread] );
    }];

2-NSOperation其他用法

(1)队列可以暂停操作,需要开始的时候再开始就好
[queue setSuspended:YES];
(2)队列可以把任务全部取消
[queue cancelAllOperations];
(3)NSOperation依赖
现在有三个任务A、B、C,然后添加到队列queue中,如果想要按照一定顺序执行这三个任务,比如A ,B,C顺序执行,只要添加两个依赖关系就可以
[B addDependency:A];
[C addDependency:B];
(4)NSOperation获取主线程,这样任务都在主线程中执行
NSOperationQueue *mainQueue=[NSOperationQueue mainQueue];
(5)NSOperation有一个maxConcurrentOperationCount属性,设置值代表最大开启线程数。
(6)NSoperation的线程通信 举一个回到主线程的例子

// Nsoperation的线程通信
    [queue addOperationWithBlock:^{
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            //...
        }];
    }];

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-09-19 09:09  MrYude  阅读(183)  评论(0编辑  收藏  举报

导航