iOS多线程技术总结

2019-04-30  本文已影响0人  繁星mind

多线程技术的优缺点

1.NSThread
优点:NSThread 比其他两个轻量级,是基于Pthreads封装的,更底层。

缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销

2.GCD
GCD是iOS4.0推出的,主要针对多核cpu做了优化,是C语言的技术,这套 API 引入了编程范式的变化,使从线程和线程函数的角度思考,变为从任务和队列的角度思考。
GCD 使用队列来派发任务(block),队列分为串行队列和并发队列,任务的派发方式分为同步派发和异步派发。GCD 自己维护了一个底层的线程库实现,以支持并发和异步的执行模型。使用 GCD 可以减轻开发者处理并发问题的负担,减少类似于死锁之类的潜在错误,而且能够自动地随着逻辑处理器的个数而扩展。
GCD是将任务(block)添加到队列(串行/并行/全局/主队列),并且以同步/异步的方式执行任务的函数,任务的取出遵循队列的FIFO原则:先进先出,后进后出

GCD执行三个维度 GCD队列和派发方式总结

GCD提供了一些NSOperation不具备的功能

3.NSOperation

NSOperation是iOS2.0推出的,iOS4.0之后重写了NSOperation

NSOperation将操作(异步的任务)添加到队列(并发队列),就会执行指定操作的方法

NSOperation里提供的方便的操作

对于Operation、GCD:
优点:不需要关心线程管理,数据同步的事情。

两者区别:NSOperationQueue可以方便的管理并发、NSOperation之间的优先级。GCD主要与block结合使用。代码简洁高效

1.GCD的核心是C语言写的系统服务,执行和操作简单高效,因此NSOperation底层也通过GCD实现,换个说法就是NSOperation是对GCD更高层次的抽象,这是他们之间最本质的区别.因此如果希望自定义任务,建议使用NSOperation;

2.依赖关系,NSOperation可以设置两个NSOperation之间的依赖,第二个任务依赖于第一个任务完成执行,GCD无法设置依赖关系,不过可以通过dispatch_barrier_async来实现这种效果;

3.KVO(键值对观察),NSOperation和容易判断Operation当前的状态(是否执行,是否取消),对此GCD无法通过KVO进行判断;

4.优先级,NSOperation可以设置自身的优先级,但是优先级高的不一定先执行,GCD只能设置队列的优先级,无法在执行的block设置优先级;

5.效率,直接使用GCD效率确实会更高效,NSOperation会多一点开销,但是通过NSOperation可以获得依赖,优先级,继承,键值对观察这些优势,相对于多的那么一点开销确实很划算,鱼和熊掌不可得兼,取舍在于开发者自己;

6,GCD 只支持FIFO 的队列,而NSOperationQueue可以调整队列的执行顺序(通过调整权重)。NSOperationQueue可以方便的管理并发、NSOperation之间的优先级。

区别总结:

  1. 性能:GCD更接近底层,而NSOperationQueue则更高级抽象,所以GCD在追求性能的底层操作来说,是速度最快的。这取决于使用Instruments进行代码性能分析,如有必要的话

  2. 从异步操作之间的事务性,顺序行,依赖关系。GCD需要自己写更多的代码来实现,而NSOperationQueue已经内建了这些支持

  3. 如果异步操作的过程需要更多的被交互和UI呈现出来,NSOperationQueue会是一个更好的选择。底层代码中,任务之间不太互相依赖,而需要更高的并发能力,GCD则更有优势。

多线程应用实例

参考:
iOS中的多线程技术
iOS基础深入补完计划--多线程(面试题)汇总
iOS多线程NSThread,GCD ,NSOperation
iOS面试题11- NSThread/NSOperation/GCD的优缺点总结
多线程NSOperation 与 GCD的区别

上一篇 下一篇

猜你喜欢

热点阅读