GCD与NSOperation
2018-04-01 本文已影响21人
8fe8946fa366
1.简单区别
GCD是纯C语言的API,而NSOperation是oc对象,NSOperation的底层是用GCD来实现的。
GCD中用block块来包装任务,而在NSOperation里用NSOperation对象来包装任务。
NSOperation里也有队列的概念,就是NSOperationQueue,可以用block的方式把任务添加到队列里,addOperationWithBlock:
NSOperationQueue有两种类型,主队列和非主队列。
主队列:[NSOperationQueue mainQueue]; 和gcd中的主队列一样
非主队列:[[NSOperationQueue alloc]init]; 同时具备并发和串行的功能,默认情况是并发队列
2.什么样的场景适合用NSOperation
1.取消某个任务
在把任务NSOperation添加到NSOperationQueue之后,可以在NSOperation对象上调用cancel方法,在任务执行之前把任务取消,已经执行的任务无法取消。
而通过块把任务添加到GCD以后没办法取消。
2.指定操作间的依赖关系
[opt1 addDependency opt2];opt2执行完以后再执行opt1
⚠️:多个队列间的操作也可以设置操作依赖,但是操作依赖不能循环,否则两个操作都无法执行。
3.NSOperation对象的属性变化可以通过KVO来监控
比如说可以监听isCancelled属性来判断任务是否已经取消,或者通过isFinished判断任务是不是已经完成。
4.指定操作的优先级
5.重用NSOperation对象
因为NSOperation本身是一个oc对象,对象在运行过程中可以充分利用其中的信息,实现其它更复杂的操作。