GCD与NSOperation的区别:
1.GCD是底层C语言构成的API
NSOperation及其对象时ObjectiveC对象
在GCD中执行队列中执行的是由block构成的任务,这是个轻量级的数据结构
而NSOperation作为一个对象,为我们提供了更多的选择
2.在NSOperationQueue中的任务可以随时取消,GCD也可以但是需要大量复杂代码
3.NSOperation能方便设置依赖关系
4.NSOperation能应用KVO,监听任务是否完成,比GCD更有效管理后台任务
5.NSOperation可以在同一个队列中设置任务的优先级,GCD只能设置不同队列的优先级,如果要区分block任务的优先级需要大量复杂代码
6.对NSOperation类继承可以添加成员变量和成员方法
NSOperation本身是抽象基类,因此必须使用它的子类,子类有三种:
1.NSInvocationOperation
2.NSBlockOperation
3.自定义
NSOperation对象的isConcurrent方法会告诉我们这个操作相对于调用start方法的线程,是同步还是异步执行。isConcurrent方法默认返回NO,表示操作与调用线程同步执行
如果我们想在一个NSOperation执行完毕后做一些事情,就调用NSOperation的setCompletionBlock方法来设置想做的事情
NSInvocationOperation:
[[NSInvocation alloc]initWith...];
[.. start]; //没有添加到NSOperationQueue就是在主线程中
NSBlockOperation:
[[NSBlockOperation blockOperationWithBlock:...]
[.. addExcutionBlock:..] //添加更多任务,即使没有放在NSOperationQueue中,当任务>1的时候,自动增加线程
[.. start]
队列:
[[NSOperationQueue alloc]init]
[.. addOperation:..] //自动执行,不用调用start了,自动开启线程
设置最大并发数: maxCurrentOperationCount
队列取消:cancelAllOperation
单个取消:-(void)cancel
暂停:setSuspened:(BOOL)
优先级: .priority
依赖: [A addDependency:B] 表示B先执行再执行A
监听: .completionBlock
自定义NSOperation
重写- (void)main方法,在里面实现想执行的任务
重写- (void)main方法的注意点
自己创建自动释放池(因为如果是异步操作,无法访问主线程的自动释放池)
经常通过- (BOOL)isCancelled方法检测操作是否被取消,对取消做出响应