参考: 感谢小笨狼的《漫谈GCD》
队列
- 串行队列
- 并行队列
先说队列
串行队列和并行队列,其实都是按照顺序开始执行的。请看下图
队列中添加任务的方式 —— 同步与异步
说明一:
- 之前一直误解同步和异步的概念。其实同步和异步,指的都是,对一个已创建的队列,把任务(可以认为是block)添加进去的方式。
- 因为GCD的机制,不论是串行/并行队列,都是FIFO的概念,而且管理而言都是GCD内部自行控制,所以其实可以跳开线程这一层,直接来关注队列。
说明二:
- 在关注串行/并行+同步/异步之前有必要说一下主队列。
我们整个程序的执行,包括UI更新,可以看做是主队列。比如我们的ViewDidLoad中执行的语句,一步步顺序执行,这就是主队列中的操作。 - 所谓任务,你可以看做是单独一句代码,也可以看做是一个block
串行添加任务 —— 同步/异步添加任务到串行队列中
- 代码:
- 异步添加队列
NSLog(@"1.in main queue");
dispatch_queue_t globalQueue = dispatch_queue_create("serialQ", DISPATCH_QUEUE_SERIAL);
dispatch_async(globalQueue, ^{
// task
NSLog(@"2.execute task");
});
NSLog(@"3.in main queue, completed");
执行结果为:
1.in main queue
3.in main queue, completed
2.execute task
- 同步添加队列 —— 把上面的代码改成
dispatch_sync(globalQueue, ^{
// task
NSLog(@"2.execute task");
});
执行结果为:
1.in main queue
2.execute task
3.in main queue, completed
并行添加任务 —— 同步/异步添加任务到串行队列中
- 代码:
- 同步和异步可以一起说添加队列
NSLog(@"1.main queue");
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalQueue, ^{
NSLog(@"2.task");
});
NSLog(@"3.main queue");
-
异步& 同步:
死锁和队列分类
死锁的发生
获取系统提供的串行/并行队列
- 获取主队列 : —— 串行队列
dispatch_queue_t globalQueue = dispatch_get_main_queue();
- 获取全局队列队列:—— 并行队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);