简介
- GCD(Grand Center Dispatch)是Apple为多核的并行运算提出的解决方案,纯C语言
- 更加适配多核处理器,且自动管理线程的生命周期,使用起来较为方便
GCD通过任务和队列实现多线程功能
- 任务:描述所要执行的操作
- 队列:用来存放所要执行的任务,队列中的任务遵循FIFO(First In First Out)原则
GCD的任务函数(是否开启新的线程)
GCD的队列(任务的执行方式)
并发队列
- 开启多个线程,使队列中的多个任务并发执行(需要异步执行函数的配合)
串行队列
队列的种类
串行队列
并发队列
主队列(串行,只能在主线程中运行)
- dispatch_queue_t dispatch_get_main_queue(void),获取主队列
全局队列(并发)
- dispatch_queue_t dispatch_get_global_queue(long identifier, unsigned long flags)
任务与队列的组合
同步函数
同步函数主队列
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
});
dispatch_sync(queue, ^{
});
同步函数串行队列
dispatch_queue_t queue = dispatch_queue_create("com.23565@qq", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
});
dispatch_sync(queue, ^{
});
同步函数并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_sync(queue, ^{
});
dispatch_sync(queue, ^{
});
异步函数
异步函数主队列
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
});
dispatch_async(queue, ^{
});
异步函数串行队列
dispatch_queue_t queue = dispatch_queue_create("com.23565@qq", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
})
dispatch_async(queue, ^{
})
异步函数并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
});
dispatch_async(queue, ^{
});
线程之间的通信
GCD的其他任务
单次执行(通常用在单例模式的设计中)
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});
延迟执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
});
[self performSelector:@selector(run) withObject:self afterDelay:2.0];
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:NO]
快速迭代
void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t))
Barrier
dispatch_queue_t queue = dispatch_queue_create("123", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
});
dispatch_barrier_async(queue, ^{
});
dispatch_async(queue, ^{
});
队列组
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
});
dispatch_group_async(group, queue, ^{
});
dispatch_group_notify(group, queue, ^{
});
GCD定时器
实现原理
- 创建一个DISPATCH_SOURCE_TYPE_TIMER类型的dispatch source,并添加到dispatch queue,通过dispatch source来响应事件
- 通过函数void dispatch_source_set_timer(dispatch_source_t source,
dispatch_time_t start, uint64_t interval, uint64_t leeway),来设置dispatch
source的执行事件
实现代码
dispatch_queue_t queue = dispatch_get_main_queue();
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(8.0 * NSEC_PER_SEC));
uint64_t interval = (uint64_t)(1.0 * NSEC_PER_SEC);
dispatch_source_set_timer(self.timer, start, interval, 0);
dispatch_source_set_event_handler(self.timer, ^{
});
dispatch_resume(self.timer);
dispatch_cancel(self.timer);
|