先明确几个概念吧!异步
&3.2 同步与异步async
串行与并行针对的是队列,而同步与异步,针对的则是线程。post
最大的区别在于,同步线程要阻塞当前线程,必需要等待同步线程中的任务执行完,返回之后,才能继续执行下一任务;而异步线程则是不用等待。spa
&3.3 GCD API线程
GCD API不少,这里仅介绍本文用到的。blog
系统标准提供的两个队列队列
// 全局队列,一个特殊的并行队列dispatch_get_global_queue// 主队列,在主线程中运行,由于主线程只有一个,因此这是一个特殊的串行队列dispatch_get_main_queue复制代码get
除此以外,还能够本身生成队列同步
// 从DISPATCH_QUEUE_SERIAL看出,这是串行队列dispatch_queue_create("com.demo.serialQueue", DISPATCH_QUEUE_SERIAL)// 同理,这是一个并行队列dispatch_queue_create("com.demo.concurrentQueue", DISPATCH_QUEUE_CONCURRENT)复制代码queue
同步与异步线程的建立:
dispatch_sync(..., ^(block))// 同步线程dispatch_async(..., ^(block))// 异步线程
案例与分析
案例一: 当同步遇到了串行
NSLog(@"1"); // 任务1
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");// 任务2
});
NSLog(@"3"); // 任务3
摘自 http://www.javashuo.com/article/p-tpmdjgpy-bs.html
小结
简单来讲就是,在串行队列里添加同步线程(任务),线程中有(task1),task2
敲黑板了!
同步任务会阻塞当前线程而且将任务task1添加到队列(串行)中.
此时队列中的顺序是: 同步线程 task2 task1
此时就出现了,先有的蛋仍是先有的鸡的问题!