美文网首页
iOS多线程 - NSOperation和NSOperation

iOS多线程 - NSOperation和NSOperation

作者: 一只呱呱 | 来源:发表于2018-02-04 16:06 被阅读0次

在上一篇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

相关文章

网友评论

      本文标题:iOS多线程 - NSOperation和NSOperation

      本文链接:https://www.haomeiwen.com/subject/wivmzxtx.html