GCD 技术是一个轻量的,底层实现隐藏的神奇技术,我们能够通过GCD和block轻松实现多线程编程,有时候,GCD相比其他系统提供的多线程方法更加有效,当然,有时候GCD不是最佳选择,另一个多线程编程的技术 NSOprationQueue 让我们能够将后台线程以队列方式依序执行,并提供更多操作的入口,这和 GCD 的实现有些类似。

这种类似不是一个巧合,在早期,MacOX 与 iOS 的程序都普遍采用Operation Queue来进行编写后台线程代码,而之后出现的GCD技术大体是依照前者的原则来实现的,而随着GCD的普及,在iOS 4 与 MacOS X 10.6以后,Operation Queue的底层实现都是用GCD来实现的。


那这两者直接有什么区别呢?

  1. GCD是底层的C语言构成的API,而NSOperationQueue及相关对象是Objc的对象。在GCD中,在队列中执行的是由block构成的任务,这是一个轻量级的数据结构;而Operation作为一个对象,为我们提供了更多的选择;
  2. 在NSOperationQueue中,我们可以随时取消已经设定要准备执行的任务(当然,已经开始的任务就无法阻止了),而GCD没法停止已经加入queue的block(其实是有的,但需要许多复杂的代码);
  3. NSOperation能够方便地设置依赖关系,我们可以让一个Operation依赖于另一个Operation,这样的话尽管两个Operation处于同一个并行队列中,但前者会直到后者执行完毕后再执行;
  4. 我们能将KVO应用在NSOperation中,可以监听一个Operation是否完成或取消,这样子能比GCD更加有效地掌控我们执行的后台任务;
  5. 在NSOperation中,我们能够设置NSOperation的priority优先级,能够使同一个并行队列中的任务区分先后地执行,而在GCD中,我们只能区分不同任务队列的优先级,如果要区分block任务的优先级,也需要大量的复杂代码;
  6. 我们能够对NSOperation进行继承,在这之上添加成员变量与成员方法,提高整个代码的复用度,这比简单地将block任务排入执行队列更有自由度,能够在其之上添加更多自定制的功能。

总的来说,Operation queue 提供了更多你在编写多线程程序时需要的功能,并隐藏了许多线程调度,线程取消与线程优先级的复杂代码,为我们提供简单的API入口。从编程原则来说,一般 我们需要尽可能的使用高等级、封装完美的API,在必须时才使用底层API。但是我认为当我们的需求能够以更简单的底层代码完成的时候,简洁的GCD或许 是个更好的选择,而Operation queue 为我们提供能更多的选择。

转载于:https://www.cnblogs.com/sunjianfei/p/5959103.html

NSOprationQueue 与 GCD 的区别与选用相关推荐

  1. s905各种型号的区别_了解各种型号铅笔的区别与选用原则,学习削笔技巧

    ​本文是何老师的新书<自由手绘必修课--关键20小时,习得画啥像啥的手绘基本功与创意表达能力>中的第2小节内容,内容包括各种型号铅笔的区别与选用原则,削笔技巧,文末配有视频详解版. 本书还 ...

  2. elasticsearch 与 传统数据库的区别与选用

    elasticsearch 与 传统数据库的区别与选用 1:ES ElasticSearch是一款分布式全文检索框架,底层基于Lucene实现. ElasticSearch 使用 JSON 格式存储数 ...

  3. char类型和varchar的区别和选用

    一.先说结论 1.char的优点是存储空间固定,所以存储读取速度快.缺点是空间冗余,对于数据量大的表,非固定长度属性使用char字段,空间浪费. 2. varchar字段,存储的空间根据存储的内容变化 ...

  4. 多线程中,NSOperationQueue和GCD的区别

    1.效率肯定是delegate比nsnotification高. 2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值, 也就是dele ...

  5. mysql中char,varchar与text类型的区别和选用

    关于char,varchar与text平时没有太在意,一般来说,可能现在大家都是用varchar.但是当要存储的内容比较大时,究竟是选择varchar还是text呢?不知道...... text .  ...

  6. 【膜摸摸】网红步进电机驱动A4988和DRV8825的对比和区别及选用实践 for 四轴CNC雕刻/3D打印

    [转自]http://blog.csdn.net/ling3ye/article/details/47001251 用Arduino驱A4988驱动电机对于DIY3D打印机: 材料清单BOM: Ard ...

  7. mysql中char,varchar和text类型的区别和选用

    首先两点需要知道: MySQL是以字符为单位解释字符列定义中的长度.(在MySQL 4.1之前是以字节为单位进行解释.)这适用于char,varchar和text类型. MySQL 5.0.3及以后的 ...

  8. amesim子模型_Amesim液压管道子模型(一):子模型的区别

    文章来源于Amesim学习与应用公众号,作者新浩 Amesim中液压管道子模型有十余种之多,很多人在使用时通常会直接选用首选子模型,而不太在意不同管道子模型之间的区别.其实,不同管道子模型适用于不同场 ...

  9. amesim子模型_Amesim液压管道子模型(二):子模型的选用

    文章来源 Amesim学习与应用公众号,作者新浩 1 引言在<Amesim液压管道子模型(一):子模型的区别>一文中,笔者向大家介绍了油液在管道中流动时的三种主要特性(即容性C.阻性R和惯 ...

最新文章

  1. linux关机告诉用户,在Linux服务器关机前向用户显示一条自定义消息
  2. leetcode--罗马数字转整数--python
  3. JUC并发编程六 并发架构--偏向锁
  4. jQuery 7 节点遍历
  5. ALV TREE学习笔记
  6. com.alibaba.druid.sql.parser.ParserException: syntax error, QUES %, pos 80 like报错解决
  7. Node.js的环境搭建
  8. HDTV(1920x1080)码率和视频质量关系的研究 2 (实验结果)
  9. androidstudio --debug 出现 source code not match bytecode
  10. java map统计学生名单_Java含自己的总结:集合,学生,遍历,ArrayList,Set,Map,泛型,班级,发牌—诗书画唱...
  11. python 操作微信闪电贷款_16、6个能够让Python程序快如闪电的小技巧
  12. SAP License:SAP Business One 与SAP R/3的区别
  13. js重力感应小球游戏
  14. 学生们共被分为10个等级,包括学魔、学神、学霸、学痞、学弱^
  15. 攻防世界MISC(杂项)新手练习区
  16. HTML 渲染组件出错,这个问题可以通过安装某个缺失组件来解决。您是否想要了解详细信息? 的解决办法
  17. 数据结构与算法(Python版)十六:有序表抽象数据类型及Python实现
  18. 考勤月度统计mysql_mysql中跨月统计考勤天数-问答-阿里云开发者社区-阿里云
  19. 51单片机之温度传感器与液晶显示屏
  20. TBschedule入门

热门文章

  1. Adobe Audition CC 2020中文版
  2. T4模板使用记录,生成Model、Service、Repository
  3. 深入理解建造者模式 ——组装复杂的实例
  4. spring: 使用Spring提供的JDBC模板(使用profiles选择数据源/使用基于JDBC驱动的数据源)...
  5. 守护线程与非守护线程的区别
  6. combobox绑定数据
  7. Rails 定时任务——whenever实现周期性任务
  8. 那些年我们踩到过的坑(二):3.1 版 MultiThreadedHttpConnectionManager 未releaseConnection导致应用服务器宕机...
  9. jquery中的DOM操作集锦
  10. XtraBackup出现 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'