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

iOS多线程小结( NSOperation)

2016-06-07 16:35 330 查看
一) NSOperation使用方法:

NSOperation 实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。NSOperation在ios4后也基于GCD实现,但是相对于GCD来说可控性更强,并且可以加入操作依赖。NSOperation提供了ready, cancelled, executing, finished这几个状态变化,我们的开发也是必须处理自己关心的其中的状态。这些状态都是基于keypath的KVO通知决定,所以在你手动改变自己关心的状态时,请别忘了手动发送通知。这里面每个属性都是相互独立的,同时只可能有一个状态是YES。finished这个状态在操作完成后请及时设置为YES,因为NSOperationQueue所管理的队列中,只有isFinished为YES时才将其移除队列,这点在内存管理和避免死锁很关键。

1.NSInvocationOperation:

NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download:) object:nil];


[op start];
//开始

[op cancel];
//取消

2 NSBlockOperation

NSBlockOperation *block = [NSBlockOperation     blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]); //处理线程的block方法
}];


3 NSOperationQueue

一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的。也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的。一旦NSoperation添加到NSoperationQueue中,用户就无权对NSoperation管理,都有NSoperationQueue来执行。


3.1 添加一个队列

NSoperationQueue *myQueue = [[NSOperationQueue alloc]init];
NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download:) object:nil];
[myQueue addOperation:op];


3.2 主队列(任何刷新UI的方法都必须在主队列中执行)

[[NSOperationQueue mainQueue]addOperationWithBlock:^{
//可以执行刷新UI控件的方法
}];


3.3 队列直接可以设置依赖,比如队列1需要队列2执行完毕后才能执行(addDependency)

NSBlockOperation *block1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];

NSBlockOperation *block2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
[block1 addDependency:block2];
[myQueue addOperation:block1];
[myQueue addOperation:block2];


3.4可以设置最大并发的操作数量

[myQueue setMaxConcurrentOperationCount:2];


3.5 一旦添加到队列,队列就拥有了这个Operation对象并且不能被 删除,唯一能做的事情是取消。

[myQueue cancelAllOperations];


3.6获取NSOperation

myQueue.operations 这是一个数组,里面存放这添加进入这个队列的所有任务

3.7 如果你想临时暂停Operations的执行,可以使用queue的setSuspended:方法暂停queue。

[myQueue setSuspended:YES];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息