您的位置:首页 > 移动开发 > IOS开发

IOS - NSOperation详细总结

2015-09-19 09:09 363 查看

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:^{
//...
}];
}];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 多线程