- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
并发编程之Operation Queue和GCD
并发编程之GCD
在《并发编程之Operation Queue》中讲了Cocoa并发编程中的Operation Queue,了解了Operation Queue是一个面向对象的并发编程接口,它支持并发数,线程优先级,任务优先级,任务依赖关系等多种配置,可以方便满足各种复杂的多任务处理场景。本篇将接着讲另一种并发编程机制 – GCD(Grand Central Dispatch)。iOS4.0中首度引入GCD,GCD是管理任务执行的一项技术,它使得我们对多任务处理变得更加方便和有效。它支持同步或异步任务处理,串行或并行的处理队列(Dispath Queue),非系统调用的信号量机制,定时任务处理,进程、文件或网络的监听任务等。这个庞大的任务处理技术大大减少了线程的管理工作,使基于任务的开发变得更加高效。
?
Dispatch Queue
Dispatch Queue是一个任务执行队列,可以让你异步或同步地执行多个Block或函数。Dispatch Queue是FIFO的,即先入队的任务总会先执行。目前有三种类型的Dispath Queue:
1.串行队列(Serial dispatch queue)
2.并发队列(Concurrent dispatch queue)
3.主队列(Main dispatch queue)
?
串行队列
串行队列一次只能处理一个任务,可以由用户调用dispatch_queue_create创建:
dispatch_queue_t?queue;?
queue?=?dispatch_queue_create(com.example.MyQueue,?NULL);?
dispatch_queue_create第一个参数是串行队列标识,一般用反转域名的格式表示以防冲突;第二个参数是queue的类型,设为NULL时默认是DISPATCH_QUEUE_SERIAL,将创建串行队列,在必要情况下,你可以将其设置为DISPATCH_QUEUE_CONCURRENT来创建自定义并行队列。
?
并行队列
并行队列可以同时处理多个任务,在不得以的情况下可以用dispatch_queue_create创建,但一般我们都要用系统预定义的并行队列,即全局队列(Global Concurrent Dispatch Queues)。目前系统预定义了四个不同运行优先级的全局队列,我们可以通过dispatch_get_global_queue来获取它们。
dispatch_queue_t?aQueue?=?dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,?0);?
?
dispatch_get_global_queue第一个参数是队列的优先级,分别对应四个全局队列:
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
?
dispatch_get_global_queue中第二个参数目前系统保留,请设置为0即可。
?
主队列
主队列是一个特殊的队列,它是系统预定义的运行在主线程的一个Dispatch Queue。可以通过dispatch_get_main_queue来获取唯一的主队列。主队列一般运行一些需要与主线程同步的一些短时任务。
dispatch_queue_t?mainQueue?=?dispatch_get_main_queue();?
?
获取当前队列
你可以通过dispatch_get_current_queue获取运行时的队列:
dispatch_queue_t?currentQueue?=?dispatch_get_current_queue();?
如果在队列执行任务中调用,返回执行此任务的队列;如果在主线程中调用,将返回主队列;如果在一般线程(非主线程线程非队列执行任务)中调用,返回DISPATCH_QUEUE_PRIORITY_DEFAULT全局队列。
?
在队列中运行任务
你可以随时向一个队列中添加一个新任务,只需要调用一下dispatch_async即可:
dispatch_async(aQueue,?^{?
????//Do?some?work;?
});?
?
dispatch_async中的任务是异步执行的,就是说dispatch_async添加任务到执行队列后会立刻返回,而不会等待任务执行完成。然而,必要的话,你也可以调用dispatch_sync来同步的执行一个任务:
dispatch_sync(aQueue,?^{?
????//Do?
您可能关注的文档
- 尖山七期策划---对尖山地区花椒核桃种植技术的指导与服务.doc
- 尚超群格式范文.doc
- 就当前能源发展与环境问题的讨论与分析.doc
- 就业的性别隔离与性别利益分化.doc
- 尹琪的论文:浅析博物馆旅游的研究进展及启示.doc
- 尾盘战法之观点(图解)--转载新浪博客.doc
- 居民基本健康知识和行为应知应会(255问).doc
- 尔雅课西方名著导读.doc
- 山东2010年10月自考开考专业科目一览表.doc
- 山东大学选修课好课,神课,不用去上给分高.doc
- 私募基金监管及合规运营小蓝本【4月刊】境内外_2024年.pdf
- 联合国西亚经济社会委员会-阿拉伯国家劳动力统计状况( State of Labour Force Statistics in Arab States 202405.pdf
- 高盛-TOP OF MIND-央行分化,中国市场向上及铜价和金.pdf
- 数据中心物理基础设施管理要求白皮书(2024).pdf
- 营销策划 -娃哈哈.PQQ店中店项目-悠简综合抗衰管理系统 2024.pdf
- 全球游戏耳机市场调研 2024.pdf
- 高盛-微软-GENAI发布提升领导力.pdf
- 中小学综合实践活动指导纲要.docx
- KEYENCE基恩士HR-X 系列 MITSUBISHI Q SERIES PLC-LINK 连接指南 通信模块“QJ71E71-100” 篇.pdf
- 大疆 DJI Avata 2 - 安全概要 (畅飞套装) v1.0.pdf
文档评论(0)