多线程技术的优缺点
1.NSThread
优点:NSThread 比其他两个轻量级,是基于Pthreads封装的,更底层。
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销
2.GCD
GCD是iOS4.0推出的,主要针对多核cpu做了优化,是C语言的技术,这套 API 引入了编程范式的变化,使从线程和线程函数的角度思考,变为从任务和队列的角度思考。
GCD 使用队列来派发任务(block),队列分为串行队列和并发队列,任务的派发方式分为同步派发和异步派发。GCD 自己维护了一个底层的线程库实现,以支持并发和异步的执行模型。使用 GCD 可以减轻开发者处理并发问题的负担,减少类似于死锁之类的潜在错误,而且能够自动地随着逻辑处理器的个数而扩展。
GCD是将任务(block)添加到队列(串行/并行/全局/主队列),并且以同步/异步的方式执行任务的函数,任务的取出遵循队列的FIFO原则:先进先出,后进后出
![](https://img.haomeiwen.com/i1286243/a9023e072441531d.png)
![](https://img.haomeiwen.com/i1286243/12d8de54c1ad7538.png)
GCD提供了一些NSOperation不具备的功能
-
一次性执行:可以保证某一段代码在程序运行的过程中只被执行一次;一次性执行是线程安全的,在多线程环境下也是只执行一次;应用场景:设计单例模式
-
延迟执行:既实现等待多长时间后在哪个队列中执行什么代码块
-
调度组:监听一组异步任务执行结束之后,我们能够得到统一的通知;注意:在其调度组内的任务执行完毕后执行后面的”刷新主界面”方法与”玩完”之间的执行没有先后顺序;
3.NSOperation
NSOperation是iOS2.0推出的,iOS4.0之后重写了NSOperation
NSOperation将操作(异步的任务)添加到队列(并发队列),就会执行指定操作的方法
NSOperation里提供的方便的操作
-
最大并发数,
-
队列的暂定/继续
-
取消队列中所有的操作
-
指定操作之间的依赖关系(GCD可以用同步实现,但是比较麻烦)
对于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之间的优先级。
区别总结:
-
性能:GCD更接近底层,而NSOperationQueue则更高级抽象,所以GCD在追求性能的底层操作来说,是速度最快的。这取决于使用Instruments进行代码性能分析,如有必要的话
-
从异步操作之间的事务性,顺序行,依赖关系。GCD需要自己写更多的代码来实现,而NSOperationQueue已经内建了这些支持
-
如果异步操作的过程需要更多的被交互和UI呈现出来,NSOperationQueue会是一个更好的选择。底层代码中,任务之间不太互相依赖,而需要更高的并发能力,GCD则更有优势。
多线程应用实例
-
YYDispatchQueuePool 通过 CPU 核心数来限制总的线程数量(实际上只是将数量限制在合理的范围内),提高 CPU 利用率的同时又尽量减少线程切换的开销。
-
SDWebImage 在子线程批量处理从磁盘读取图片的任务。在 I/O 操作频繁的情况下,通过多线程充分利用等待时间,同时防止了主线程的阻塞。
参考:
iOS中的多线程技术
iOS基础深入补完计划--多线程(面试题)汇总
iOS多线程NSThread,GCD ,NSOperation
iOS面试题11- NSThread/NSOperation/GCD的优缺点总结
多线程NSOperation 与 GCD的区别
网友评论