【原创】OperationQueue和GCD 不确定的奇妙关系

iOS中多线程的几种实现方式是面试的热门问题,这篇文章不是讲解这三种常用的实现方式,而是想针对另外的一个引出问题:OperationQueue和GCD的关系,做一下讨论。

奇妙的关系

一直以来,OC开发界都有着这样的说法:OperationQueue是GCD的面向对象封装。但是细心的朋友们可能会有这样的疑问:OperationQueue是iOS 2就加入的老家伙,而使用block的GCD是iOS 4才有的新成员,老技术怎么可能是新技术的封装呢?还有OperationQueue中的Operation是可以cancel的,可GCD显然没有这样的功能,为什么一个功能底层没有,而上层封装却提供了呢?
我也同样有这个疑问,所以特地上网查阅了相关的文档和讨论。苹果官方文档中有这样的描述:

Operation queues usually provide the threads used to run their operations. 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 asynchronous or synchronous operations.

简单翻译一下:Operation Queue通常提供线程,用来执行Operation。Operation Queue使用libdispatch库(又叫GCD)来启动执行Operation。因此,不管Operation是否被指定为同步或者异步,它们总是在单独的线程上执行。

争论从来没停止过

这样看来,OperationQueue的确就是GCD的封装,而且stack overflow上很多高票回答也都提到了这件事,比如这个问题中的回答就非常有意思。

大意是说从iOS 4开始OperationQueue内部就是用GCD实现了,建议用更高级的api以便更好的抽象,就意味着多用OperationQueue而非GCD。

然后我往下又看到了票数次高的回答。

上来就直接怼了上面最高票的回答,说他在GCD之前,用OperationQueue管理并发但是效率很低,在后来换成GCD之后流畅到飞起,所以他建议多使用GCD,如果不是特殊的地方,就尽量不要用OperationQueue。

说到这里似乎有些跑题了,其实我写这篇博客的目的不是想说什么时候用GCD什么时候用OperationQueue,根据每个开发者的习惯、业务需求、性能要求不同,会有不同的选择。

关键的问题是,看到这里我心里的疑惑更多了,为什么OperationQueue和GCD的性能差距可以如此之大?如果真的是封装关系,性能差距应该不至于大到这种程度。

越辩越明

于是带着这个疑问,我就继续饶有兴趣地翻阅大家在GCD和OperationQueue之间争论的话题。无意之间我又看到了这样的争论:

问题和回答其实都不重要,我觉得最精彩的地方在评论:

das在回答中提到OperationQueue是一个big hammer(大锤子),这个问题没必要祭出大锤子来解决。

Tricertops在评论中问到:OperationQueue就是GCD队列的OC封装,为什么你说它是“大锤子”?它提供了简单的api所以我喜欢它。

das回复到:你说的不对,OperationQueue不是GCD的封装,它是一个复杂队列,依赖和优先追踪系统的实现方式与GCD完全不同。它在内部使用GCD进行一些同步(与自旋锁和互斥锁一起),但是在执行客户代码方面,它与GCD唯一的关系就是OperationQueue会在一个操作执行结束,准备下一次的时候,对全局并发队列调用一次dispatch_async()。所有这些复杂性和灵活性都是要付出性能代价,简单操作的话,OperationQueue比GCD慢1000倍。

下面的quellish也是反对加质疑了das的说法。

再下面,das仍然坚持奋战:OperationQueue不是GCD的封装,除了队列,GCD和OperationQueue没有任何等价的概念。这是因为OperationQueue API的设计比GCD早几年,如果您认为文档存在误导性,请给bugreporter.apple.com提交错误信息。。。

战火越烧越旺,直到看见了下一楼,点进去是das同(da)学(shen)的领英

不由得一句我靠 有没有。。。das是苹果公司GCD的开发者,那么上面争论的输赢和道理就不用多说了。看到这里,您是不是要回过头去看看das是如何说GCD和OperationQueue的?这下终于找到权威了,如果还不过瘾,可以点进stack overflow上das的主页,看到他更多的回答。

还有一些疑问

das不止一次地明确说到OperationQueue不是GCD的封装,为什么苹果的文档还这样写?

Operation queues use the libdispatch library (also known as Grand Central Dispatch) to initiate the execution of their operations.

其实在上面das的回答中,已经解释了这个问题:

It uses GCD internally for some synchronization (along with spinlocks and mutexes) but in terms of execution of client code the only connection to GCD is that NSOperationQueue does a dispatch_async() to the global concurrent queue at the end to execute an operation once it is ready to do so.

文档中说用OperationQueue使用GCD来initiate the execution of their operations,其实和das说的

NSOperationQueue does a dispatch_async() to the global concurrent queue at the end to execute an operation once it is ready to do so.

应该是一回事,只不过苹果的这个文档真的是非常具有误导性,还是多亏碰巧看到das大神的活跃。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容