NSOprationQueue 与 GCD 的区别与选用
GCD 技术是一个轻量的,底层实现隐藏的神奇技术,我们能够通过GCD和block轻松实现多线程编程,有时候,GCD相比其他系统提供的多线程方法更加有效,当然,有时候GCD不是最佳选择,另一个多线程编程的技术 NSOprationQueue 让我们能够将后台线程以队列方式依序执行,并提供更多操作的入口,这和 GCD 的实现有些类似。
这种类似不是一个巧合,在早期,MacOX 与 iOS 的程序都普遍采用Operation Queue来进行编写后台线程代码,而之后出现的GCD技术大体是依照前者的原则来实现的,而随着GCD的普及,在iOS 4 与 MacOS X 10.6以后,Operation Queue的底层实现都是用GCD来实现的。
那这两者直接有什么区别呢?
- GCD是底层的C语言构成的API,而NSOperationQueue及相关对象是Objc的对象。在GCD中,在队列中执行的是由block构成的任务,这是一个轻量级的数据结构;而Operation作为一个对象,为我们提供了更多的选择;
- 在NSOperationQueue中,我们可以随时取消已经设定要准备执行的任务(当然,已经开始的任务就无法阻止了),而GCD没法停止已经加入queue的block(其实是有的,但需要许多复杂的代码);
- NSOperation能够方便地设置依赖关系,我们可以让一个Operation依赖于另一个Operation,这样的话尽管两个Operation处于同一个并行队列中,但前者会直到后者执行完毕后再执行;
- 我们能将KVO应用在NSOperation中,可以监听一个Operation是否完成或取消,这样子能比GCD更加有效地掌控我们执行的后台任务;
- 在NSOperation中,我们能够设置NSOperation的priority优先级,能够使同一个并行队列中的任务区分先后地执行,而在GCD中,我们只能区分不同任务队列的优先级,如果要区分block任务的优先级,也需要大量的复杂代码;
- 我们能够对NSOperation进行继承,在这之上添加成员变量与成员方法,提高整个代码的复用度,这比简单地将block任务排入执行队列更有自由度,能够在其之上添加更多自定制的功能。
总的来说,Operation queue 提供了更多你在编写多线程程序时需要的功能,并隐藏了许多线程调度,线程取消与线程优先级的复杂代码,为我们提供简单的API入口。从编程原则来说,一般 我们需要尽可能的使用高等级、封装完美的API,在必须时才使用底层API。但是我认为当我们的需求能够以更简单的底层代码完成的时候,简洁的GCD或许 是个更好的选择,而Operation queue 为我们提供能更多的选择。
转载于:https://www.cnblogs.com/sunjianfei/p/5959103.html
NSOprationQueue 与 GCD 的区别与选用相关推荐
- s905各种型号的区别_了解各种型号铅笔的区别与选用原则,学习削笔技巧
本文是何老师的新书<自由手绘必修课--关键20小时,习得画啥像啥的手绘基本功与创意表达能力>中的第2小节内容,内容包括各种型号铅笔的区别与选用原则,削笔技巧,文末配有视频详解版. 本书还 ...
- elasticsearch 与 传统数据库的区别与选用
elasticsearch 与 传统数据库的区别与选用 1:ES ElasticSearch是一款分布式全文检索框架,底层基于Lucene实现. ElasticSearch 使用 JSON 格式存储数 ...
- char类型和varchar的区别和选用
一.先说结论 1.char的优点是存储空间固定,所以存储读取速度快.缺点是空间冗余,对于数据量大的表,非固定长度属性使用char字段,空间浪费. 2. varchar字段,存储的空间根据存储的内容变化 ...
- 多线程中,NSOperationQueue和GCD的区别
1.效率肯定是delegate比nsnotification高. 2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值, 也就是dele ...
- mysql中char,varchar与text类型的区别和选用
关于char,varchar与text平时没有太在意,一般来说,可能现在大家都是用varchar.但是当要存储的内容比较大时,究竟是选择varchar还是text呢?不知道...... text . ...
- 【膜摸摸】网红步进电机驱动A4988和DRV8825的对比和区别及选用实践 for 四轴CNC雕刻/3D打印
[转自]http://blog.csdn.net/ling3ye/article/details/47001251 用Arduino驱A4988驱动电机对于DIY3D打印机: 材料清单BOM: Ard ...
- mysql中char,varchar和text类型的区别和选用
首先两点需要知道: MySQL是以字符为单位解释字符列定义中的长度.(在MySQL 4.1之前是以字节为单位进行解释.)这适用于char,varchar和text类型. MySQL 5.0.3及以后的 ...
- amesim子模型_Amesim液压管道子模型(一):子模型的区别
文章来源于Amesim学习与应用公众号,作者新浩 Amesim中液压管道子模型有十余种之多,很多人在使用时通常会直接选用首选子模型,而不太在意不同管道子模型之间的区别.其实,不同管道子模型适用于不同场 ...
- amesim子模型_Amesim液压管道子模型(二):子模型的选用
文章来源 Amesim学习与应用公众号,作者新浩 1 引言在<Amesim液压管道子模型(一):子模型的区别>一文中,笔者向大家介绍了油液在管道中流动时的三种主要特性(即容性C.阻性R和惯 ...
最新文章
- linux关机告诉用户,在Linux服务器关机前向用户显示一条自定义消息
- leetcode--罗马数字转整数--python
- JUC并发编程六 并发架构--偏向锁
- jQuery 7 节点遍历
- ALV TREE学习笔记
- com.alibaba.druid.sql.parser.ParserException: syntax error, QUES %, pos 80 like报错解决
- Node.js的环境搭建
- HDTV(1920x1080)码率和视频质量关系的研究 2 (实验结果)
- androidstudio --debug 出现 source code not match bytecode
- java map统计学生名单_Java含自己的总结:集合,学生,遍历,ArrayList,Set,Map,泛型,班级,发牌—诗书画唱...
- python 操作微信闪电贷款_16、6个能够让Python程序快如闪电的小技巧
- SAP License:SAP Business One 与SAP R/3的区别
- js重力感应小球游戏
- 学生们共被分为10个等级,包括学魔、学神、学霸、学痞、学弱^
- 攻防世界MISC(杂项)新手练习区
- HTML 渲染组件出错,这个问题可以通过安装某个缺失组件来解决。您是否想要了解详细信息? 的解决办法
- 数据结构与算法(Python版)十六:有序表抽象数据类型及Python实现
- 考勤月度统计mysql_mysql中跨月统计考勤天数-问答-阿里云开发者社区-阿里云
- 51单片机之温度传感器与液晶显示屏
- TBschedule入门
热门文章
- Adobe Audition CC 2020中文版
- T4模板使用记录,生成Model、Service、Repository
- 深入理解建造者模式 ——组装复杂的实例
- spring: 使用Spring提供的JDBC模板(使用profiles选择数据源/使用基于JDBC驱动的数据源)...
- 守护线程与非守护线程的区别
- combobox绑定数据
- Rails 定时任务——whenever实现周期性任务
- 那些年我们踩到过的坑(二):3.1 版 MultiThreadedHttpConnectionManager 未releaseConnection导致应用服务器宕机...
- jquery中的DOM操作集锦
- XtraBackup出现 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'