简单记录GCD的学习笔记
2016-11-09 本文已影响0人
ios___developer
一、队列和任务
-
队列
1.串行队列,一般使用
dispatch_queue_create
方法创建,并指定队列的类型DISPATCH_QUEUE_SERIAL
2.并行队列,一般使用
dispatch_queue_create
方法创建,并指定队列的类型DISPATCH_QUEUE_CONCURRENT
3.主队列,使用dispatch_get_main_queue来获取。
-
任务
1.同步,不开辟子线程,使用
dispatch_sync
将任务加入队列2.异步,开辟子线程,使用
dispatch_async
将任务加入队列
二、实际应用
1.延时操作
//延时操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//2.0s后要做的事
});
2.耗时操作
//异步处理
//获取全局并行队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
//一些异步处理,例如网络请求,和耗时操作
NSLog(@"请求成功返回数据");
//创建主队列
dispatch_queue_t queueMain = dispatch_get_main_queue();
//更新UI
dispatch_sync(queueMain, ^{
//更新UI操作
});
});
3.只需要执行一次的代码,例如单例模式
//只需要执行一次的代码
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//仅仅执行一次的代码
});
三、比较串行队列,并行队列,主队列。分别加入同步异步任务
- 代码如下
//创建串行队列
dispatch_queue_t queueSerial = dispatch_queue_create("queue1", DISPATCH_QUEUE_SERIAL);
//创建并行队列
dispatch_queue_t queueConcurrent = dispatch_queue_create("queue2", DISPATCH_QUEUE_CONCURRENT);
//获取主队列
dispatch_queue_t queueMain = dispatch_get_main_queue();
//将同步任务加入串行队列
dispatch_sync(queueSerial, ^{
NSLog(@"------%@", [NSThread currentThread]);
});
//将同步任务加入并行队列
dispatch_sync(queueConcurrent, ^{
NSLog(@"------%@", [NSThread currentThread]);
});
//将同步任务加入主队列
//造成死锁
dispatch_sync(queueMain, ^{
NSLog(@"------%@", [NSThread currentThread]);
});
//将异步任务加入串行队列
dispatch_async(queueSerial, ^{
NSLog(@"------%@", [NSThread currentThread]);
});
//将异步任务加入并行队列
dispatch_async(queueConcurrent, ^{
NSLog(@"------%@", [NSThread currentThread]);
});
//将异步任务加入主队列
dispatch_async(queueMain, ^{
NSLog(@"------%@", [NSThread currentThread]);
});
- 比较列表
串行队列 | 并行队列 | 主队列 | |
---|---|---|---|
同步任务 | 不开辟子线程,顺序执行 | 不开辟子线程,顺序执行 | 死锁 |
异步任务 | 开辟子线程,绕行 | 开辟子线程,绕行 | 不开辟子线程,绕行 |
造成死锁的情况
-
同步任务加入主队列
//将同步任务加入主队列 //造成死锁 dispatch_sync(queueMain, ^{ NSLog(@"------%@", [NSThread currentThread]); });
-
同步任务加入串行队列,在任务未结束时,调起其他同步任务。
dispatch_sync(queueSerial, ^{ NSLog(@"1------%@", [NSThread currentThread]); dispatch_sync(queueSerial, ^{ NSLog(@"2------%@", [NSThread currentThread]); }); });