dispatch_sync添加到viewDidLoad卡死问题理解
Posted 黄增松的技术博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dispatch_sync添加到viewDidLoad卡死问题理解相关的知识,希望对你有一定的参考价值。
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
}
上面的代码只会打印1 然会就会线程卡死,这是为什么呢?
因为dispatch_get_main_queue()得到的是一个串行队列,串行队列的特点: 一次只调度一个任务,队列中的任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)
同步(sync) 操作,它会阻塞当前线程并等待 Block 中的任务执行完毕,然后当前线程才会继续往下运行
dispatch_sync提交一个打印任务NSLog(@”2”)到主线程关联的串行队列中,主线程关联的串行队列现在有一个viewDidLoad任务,打印任务NSLog(@”2”)排在viewDidLoad后面,队列FIFO(先进先出)的原则,打印任务NSLog(@”2”);想要得到执行必须等到viewDidLoad执行完毕后才能得到执行,但是viewDidLoad想要执行完毕必须要等打印任务NSLog(@”2”)执行完毕,所以就卡死在这了。
转自:http://blog.csdn.net/kongdeqin/article/details/53171678
以上是关于dispatch_sync添加到viewDidLoad卡死问题理解的主要内容,如果未能解决你的问题,请参考以下文章
从主队列调用 dispatch_sync 并且执行的块保存到核心数据时 iOS 死锁
dispatch_sync和dispatch_async的区别