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:^{
//...
}];
}];
版权声明:本文为博主原创文章,未经博主允许不得转载。