iOS关乎多线程的方面的知识,目前使用最频繁而且最火热的当属NSOperation和GCD。
NSOperation和GCD都是并发技术方案,能够更有效地利用多核CPU来处理问题。
As you know,NSOperation 的底层实现是GCD。那么我在开发中使用谁都是一样的,那就是谁顺手、谁方便用谁喽,这样根据实际情况来使用。
NSOperation是 抽象类(abstract 关键字修饰)。一般来说iOS程序员对于抽象类的概念不是很清晰,也不经常提到,但是在java或者C#就不一样了,有很多抽象类、抽象方法,还有虚方法(virtual关键字修饰)等,非常灵活。
那么对于抽象类和抽象方法,如下:
----抽象类:本身不能被实例化,只能通过派生类(子类)来实例化;
----抽象方法:方法定义的时候没有方法体,本身(定义时)不能被实现,只能通过派生类重新实现。 (抽象方法只能定义在抽象类中)
对于NSOperation,系统提供了 2 个子类,NSInvokeOperation 和 NSBlockOperation。加上自定义Operation共 3 种方式。
对于GCD,系统提供了很多功能,在此不一一列举。
-------------------- 分割线 -------------------
这里来说说NSOperation和GCD的不同点。
NSOperation 可以设置 最大并发数、任务与任务的依赖关系、取消操作的执行 等功能,这些是 GCD 的API中所不具备的;
GCD 可以实现 调度组 等功能,这是NSOperation所不具备的。
一、 NSOperation实现GCD调度组的功能
【调度组,就是多个任务完成之后系统会给一个通知,通知用户多个任务已完成;我们可以在通知中做其它任务。】
【方案一:添加操作集合并设置等待执行完毕】
使用 [operationQueue addOperations:@[op1, op2, op3] waitUntilFinished:YES];
的方式向队列添加操作集合,然后把添加操作的函数放到子线程中,那么会等这几个操作都执行完毕之后再进行之后的代码。
【方案二:使用KVO监听queue的operationsCount】
等到operationsCount 为 0 的时候,发出通知,任务已经完成。
【方案三:使用NSBlockOperation】
addOperation、addExecutionBlock、completionBlock
二、GCD实现NSOperation的“设置依赖关系”功能
【依赖关系,就是一个操作要等待另一个操作完成才能开始(一个操作依赖另一个操作)】
【子线程中使用多个同步任务,任务是按顺序执行】
【使用同步队列,任务是按顺序执行】
【多个调度组,每个调度组调度一个任务】
【使用多个 dispatch_barrier 障碍阻塞 】
【使用异步配合runloop使用】