GCD(Grand Central Dispatch),是苹果开发的一个多核编程解决办法,它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。支持:OS X 10.6+ 和 iOS 4+。
上面的概念从书中照搬,我对其理解就是GCD是用来帮助开发者选择将“任务”同步/异步执行,以及选择放在哪个线程中执行的工具。
GCD两个核心:任务 和 队列
队列
创建一个队列,可以使用dispatch_queue_create(,)函数,该函数方法需要传入两个参数
第一个参数对应队列的唯一标识符,可为空。
第二个参数用于表示该队列是串行的还是并发的。
创建一个串行队列
dispatch_queue_t queue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_SERIAL);
创建一个并发队列
dispatch_queue_t queue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_CONCURRENT);
GCD有两个特殊队列:
- 主队列(Main Disatch Queue),也就是主线程,若卡死该线程会导致App无法操作
dispatch_queue_t queue = dispatch_get_main_queue(); // 获取主队列
- 全局并发队列(Global Dispatch Queue)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 获取全局并发队列
任务
同步执行任务的创建方法
dispatch_sync(queue, ^{
// 需要同步执行的操作代码
});
异步执行任务的创建方法
dispatch_async(queue, ^{
// 需要异步执行的操作代码
});
线程间通信
常用场景:将耗时操作(图片下载、文件上传等)放入其他线程中异步执行,当执行完成后回到主线程刷新UI
// 全局并发队列
dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_SERIAL);
// 主线程队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(queue, ^{
NSLog(@"异步执行任务1");
dispatch_async(mainQueue, ^{
NSLog(@"回到主线程,刷新UI");
});
});
用法
GCD 主要有以下六种用法:
- dispatch_once 执行一次
- dispatch_group 队列组
- dispatch_barrier_async 栅栏
- dispatch_after 延迟执行
- dispatch_apply 快速迭代
- dispatch_semaphore 信号量
如果本文对你有帮助记得点个喜欢哈