不要再坑人啦!NSOperation才是苹果推荐使用的多线程技术!

首先声明一下,小汤我在实际开发中呢,实际上也是喜欢用GCD多一点,因为用起来感觉更方便。
但是,事实是什么呢?
苹果推荐使用的实际上是NSOperation,所以希望对此没有研究的各位不要再在博客中误导他人了啊。
再换句话来说,苹果开发使用的Objective-C语言就是面向对象的,她怎么可能推荐大家使用基于C语言的面向过程开发的东西呢? (这句话只是吐槽,请勿喷…)

关于NSOperation

很多人,在博客中说到NSOperation的时候呢,都会以它是iOS2.0推出的 这一点来强调后来iOS4.0推出的GCD才是苹果推荐使用的多线程使用方式!
对于这一点,我觉得倒也不能全怪他们,因为很多人在开发中都是通过查资料来学习的,很少有愿意看苹果给出的 官方文档 的。
事实上,苹果在官方文档中对此有专门的讲到,NSOperation的确是iOS2.0推出的,那个时候的NSOperation是通过NSThread实现的,效率的确一般,但是!!

苹果在iOS4.0推出GCD之后,又重写了NSOperation,从此以后,NSOperation的底层就是由GCD实现的了!!

下面是官方文档的原文:

(Operation queues usually provide the threads used to run their operations. In OS X v10.6 and later, operation queues use the libdispatch library (also known as Grand Central Dispatch) to initiate the execution of their operations. As a result, operations are always executed on a separate thread, regardless of whether they are designated as concurrent or non-concurrent operations. In OS X v10.5, however, operations are executed on separate threads only if their isConcurrent method returns NO. If that method returns YES, the operation object is expected to create its own thread (or start some asynchronous operation); the queue does not provide a thread for it.)

NSOperation和GCD的对比:

  1. 首先,这两者相对于NSThread或者是跨平台的pthread而言,他们的线程的生命周期都是自动管理的,开发者只要关注执行什么样的操作,不需要编写任何线程管理的代码
  2. GCD是苹果公司为多核的并行运算提出的解决方案,会自动利用更多的CPU内核(比如双核、四核),而NSOperation是基于GCD的面向对象的封装,拥有GCD的特性。
  3. GCD提供了一些NSOperation不具备的功能:

    1) 一次性执行
    2) 延迟执行 
    3) 调度组
    
  4. GCD是将任务(block)添加到队列(串行/并行/全局/主队列),并且以同步/异步的方式执行任务的函数,而NSOperation将操作(一般是异步的任务)添加到队列(一般是并发队列),就会执行指定操作的函数。

  5. NSOperation里提供了一些方便的操作:

    1) 最大并发数
    2) 队列的暂定/继续
    3) 取消所有的操作
    4) 指定操作之间的依赖关系(GCD可以用同步实现)
    

    其中,关于最大并发数这一条,就是苹果推荐使用NSOperation的另一条强有力的佐证。
    因为相对于苹果以前限制了线程的最大并发数的这一情况而言,现在,

        苹果不再限制线程的最大并发数。

也就是说,这对于使用GCD开发是不利的,因为GCD是无法控制线程的最大并发数的,而线程的并发数一旦过多…你懂得~

所以,综上,苹果实际上推荐我们开发过程中使用的是NSOperation,不是GCD!还请各位在开发中稍加注意哦~

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。