在上一篇GCD的总结里有提到Apple对GCD进行了一层封装,从此有了NSOperation和NSOperationQueue
这篇文章主要总结两件事:1. NSOperation和NSOperationQueue如何使用 2. NSOperation和GCD的对比
一、NSOperation和NSOperationQueue如何使用
(1)NSOperation
NSOperation其实相当于GCD中的block任务,要配合NSOperationQueue作为队列才能使用多线程,否则并没有开辟新线程的能力。
创建NSOperation任务,要实现NSOperation的子类:NSInvocationOperation或是NSBlockOperation来创建任务
由此可见单独使用NSOperation的start并不会开辟新的线程,但是假如addExcutionBlock就会在别的线程去执行该任务。
(2)NSOperationQueue
NSOperationQueue有两种队列:主队列和其他队列
主队列:凡是添加到主队列中的任务都在主线程中执行
NSOperationQueue*queue = [NSOperationQueue mainQueue];
其他队列:添加到这种队列中的任务会放到子线程中执行,同时包含了:串行、并发功能
于是在刚才的基础上修改一下代码:
可以看到结果变成了任务在几个不同的子线程里执行:
(3)其他队列如何实现串行和并发?
我们自己定义的队列都是其他队列,假如想要并发,就如(2)一样操作,并且可以设置最大的并发数。
要达到串行可以设置maxConcurrent = 1,值得注意的是maxConcurrent = 1并不能保证只有一个线程在执行,而是说同时只有一个线程在操作队列里的任务。这个概念和GCD的semaphore是一致的,并不需要我们自己去管理线程的创建销毁。
下图对上面的代码进行了一些修改,得出的结果:
(4)如何实现线程同步
在之前的GCD的总结里写了可以用group, barrier或是semophore来实现同步,而OperationQueue可以用addDependency来创建操作的依赖。从而实现同步,代码写起来要比GCD方便理解
二、GCD和NSOperation的对比
(1) GCD是一种轻量级的方法来实现多线程。控制起来比较麻烦,比如取消和暂停一个线程。
(2)在NSOperationQueue中,可以建立各个NSOperation之间的依赖关系。比GCD代码写起来要简单
(3)NSOperation可以对属性进行KVO监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)
(4)GCD 通过 block 指定要执行的代码,代码集中, 所有的代码写在一起的,让代码更加简单,易于阅读和维护
(5)GCD仅仅支持FIFO队列,而NSOperationQueue中的队列可以被重新设置优先级,从而实现不同操作的执行顺序调整
Reference
https://www.jianshu.com/p/4b1d77054b35
https://www.jianshu.com/p/6e6f4e005a0b
网友评论