Grand Central Dispatch(GCD)有很多部分构成,例如有很好的语言特性,运行库,还提供了系统的、高效的方式来支持具有多核处理器的iOS和OS X设备进行并发事件处理。
BSD子系统,CoreFoundation和Cocoa APIs都已经使用这个增强特性来进行扩展了,因为它可以使得你的系统和应用运行的更快,更有效率,响应更及时。GCD是运行在系统级别的,他可以更好的满足应用运行时的需求,更合理调度有限的系统资源。
GCD并不是被限制只能在系统级别应用上使用的,我们可以在更高层的应用上也使用它。但是一般情况下我们还可以考虑Cocoa中是否有类似的对象可以实现相似的功能,例如NSOperation,它也提供了很简单便捷的方式来进行并发任务处理【传送门——iOS-多线程编程学习之NSOperation(四)】。
一、GCD与ARC
当使用Objective-C
来构建应用时,所有的dispatch obeject
都是Objective-C
类型的对象。所以当在应用中开启了ARC(自动引用计数)时,这些dispatch obeject
也会想OC的对象一样被自动的发送retain
和release
消息。当ARC被禁用时(也就是进行MRC手动内存管理时),可以通过使用dispatch_retain
和dispatch_release
来实现类似OC对象的retain和release操作。
二、创建任务队列
GCD中的队列主要分两种。
- 并发队列:允许多个任务同时执行。
- 串行队列:任务按顺序依次执行。
系统默认有一个和主线程绑定的串行队列,还有一个全局的并发队列。这两个队列都可以通过响应的方法来获得。
2.1 获得主线程的串行队列
调用这个方法获取主线程队列时,该队列是由主线程来自动创建的。
dispatch_queue_t mainQueue = dispatch_get_main_queue();
2.2 获得全局的并发队列
获取全局并发队列的方法中有两个参数,第二个参数暂时没有使用,默认传值0就好。第一个参数表示队列的优先级,其中优先级主要分为4种。
- DISPATCH_QUEUE_PRIORITY_HIGH 2,优先级高
- DISPATCH_QUEUE_PRIORITY_DEFAULT 0,默认优先级,中
- DISPATCH_QUEUE_PRIORITY_LOW -2,优先级低
- DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN,后台模式,优先级最低
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2.3 创建自定义的队列
创建自定义的队列主要有两种,一种是串行队列,一种是并行队列。在创建自定义队列时会需要传两个参数,第一个为队列的名称,第二个为表示队列类型的常量(串行还是并行)。
DISPATCH_QUEUE_SERIAL //串行队列
DISPATCH_QUEUE_CONCURRENT //并行队列
代码也很简单。
//串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("com.lysongzi.serial", DISPATCH_QUEUE_SERIAL);
//并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.lysongzi.concurrent", DISPATCH_QUEUE_CONCURRENT);
三、同步和异步
当我们创建了队列之后,我们需要把任务添加到队列中,并指定以同步还是异步的方式执行添加到队列中的任务。
同步,其会在当前线程立即执行添加的任务(无论是串行还是并行队列都如此)。
异步,其会新创建一个新的线程来执行任务。而异步对于串行和并行队列的又不一样的意义的。
对于异步执行的串行队列的话,新添加的多个任务会在新创建的线程中依次执行,即一个执行完在执行另一个任务,有点类