Grand central dispatch(GCD)包含语言特征,运行时库,通过在多核ios设备上同时运行代码来对系统的性能得到更好的更深入的提升。
The BSD subsystem,coreFoundation,cocoa apis都支持使用这种enhancements(GCD),这样做可以使得system和application对响应反应迅速,使其运行的更快,更加的有效率。
充分考虑一个single application有效的运行在多核系统上的难度,或者充分考虑运行在具有不同数量的computing cores的不同的电脑上的难度,或者充分的考虑在同样的环境下多个应用之间运行GCD时对cores的竞争,对这些的充分考虑,将会更好的满足所有正在运行的应用的需要,更好的找到与这些应用相匹配的系统资源。
这里将对GCD API做介绍,GCD API支持在UNIX系统级上进行异步执行,用这个api你能够管理file descriptor ,Mach ports,signals,and timers之间的交互合作。
GCD并没有限制在系统级的应用,但在你在high- level application中使用的时候,你要考虑cocoa是否已经提供了更加容易更加能够满足你的需要的具有与GCD完成的效果相似功能的api。
Dispatch Queues and Auto reference counting
在ARC环境下,dispatch Queues的behavior将跟据你为一个已经给定的build target选择的deployment target 的变化而变化
ios6 or later:默认情况下dispatch objects(include Queues)是objective -c 对象,自动的被retain 和release 。
os x 10.8 or later::默认情况下dispatch objects(include Queues)是objective -c 对象,自动的被retain 和release 。
Earlier versions: 默认dispatch objects是core foundation objects,你必须手动的调用dispatch_retain和dispatch_release来handle reference count
如果你为了保持与以前的代码的兼容性而需要在最近的应用开发中手动的使用dispatch Quenes,你可以通过在compiler flags设置-DOS_OBJECT_USE_OBJC=0来改变他的默认设置。
Function By Task
Queuing Task For dispatch(对排队的任务进行调度)
GCD 提供FIFO Queues 去管理task,这使得你可以block object的形式来提交task,被提交到dispatch Queues的task在一个由系统管理的线程池中执行。一个线程执行哪个任务由系统决定,GCD提供三种Queues;
Main:在你的应用的main thread中连续的执行task
Concurrent:task按照FIFO的顺序dequeued,然后同时运行,can finish in any order
serial:按照FIFO的顺序在同一时间执行一个任务
The main Queue被系统自动的创建,并且与你的系统的main thread 联系起来,你的应用用下面所提供的方法中的一个(只能用一个)去激活被提交到main queue中的block.
Calling dispatch_main
Calling UIApplicationMain(IOS) or NSApplicationMain(OS)
Using a CFRunLoopRef on the main thread
用Concurrent Queues去同时执行大量的tasks,GCD 自动的创建四个 Concurrent queues,对你的app来说他们是global的,根据优先级来区分他们
你的application可以通过调用dispath_get_global_queue 函数来请求。因为concurrent queues对你的应用来说是global的,所以没有必要retain和release他们,对concurrent queues来说,retain 和release被忽略。在os x v10.7和ios 4.3 or later,你可以自己用code module去创建你自己的concurrent queues.
serial queues确保用特定的顺序去执行task,用serial queue来实现某个特定的目的,比如用它来保护资源,同步关键的过程
你的application必须明确的创建和管理serial queues,可以根据你的需要来创建,但是要避免用它来代替concurrent queues去同时执行多个大量的任务
GCD是c-level api,不能handle high level language的异常,你必须在提交到dispatch queues上的block 返回之前catch住所有的异常
Using dispatch groups
Grouping blocks允许你去同步各个blocks,使他们同步执行。只有所有的blocks被执行完之后,才会继续向下执行。
Managing dispatch object
GCD提供dispatch object interfaces 允许应用对过程的各个方面进行管理,比如memory management,暂停和重返执行,define object context,记录task data。
Using semaphores
a dispatch semaphores是传统counting semaphores的有效的实现,当 calling thread 在被阻塞的时候,dispatch semaphores call down to the kernel,如果没有线程被阻塞,则不需要call kernel.
manage dispatch source
GCD 提供一整套的dispatch sources,活动监视界面,当这样的活动发生的时候能够提交event handles给dispatch queues
当一个事件发生时,the dispatch source 异步的提交task code 给指定的dispatch queues去处理
Using dispatch I/O convenience API
dispatch I/O convenience API可以让你在file descriptor上异步的执行读写操作,the api 用基于流的原理获取文件的内容
Using dispatch I/O channel API
dispatch I/O channel API支持基于流和随机获取的方式对file descriptor的content进行操作
managing Dispatch Data objects
dispatch data objects 呈现在一个界面上,可以允许对基于内存data buffer的管理,在客户端通过把他视作一个连续的内存块来获取data buffer,但实际上他可能有多个不连续的内存块组成
Functions
dispatch_after
这个函数一直等到指定的时间才会异步的添加block到指定的dispatch queues中去。