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()

从主队列调用 dispatch_sync 并且执行的块保存到核心数据时 iOS 死锁

dispatch_sync和dispatch_async的区别

dispatch_sync

从并发队列中调用 dispatch_sync - 它是不是完全阻塞?

Dispatch Queues调度队列