• viewDidLoad dispatch_sync


    - (void)viewDidLoad
    {
        [super viewDidLoad];
        NSLog(@"1");
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"2");
        });
        NSLog(@"3");
    }


    上面的代码只会打印1 然会就会线程卡死,这是为什么呢?

    因为dispatch_get_main_queue()得到的是一个串行队列,串行队列的特点: 一次只调度一个任务,队列中的任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任

    务)

    同步(sync) 操作,它会阻塞当前线程并等待 Block 中的任务执行完毕,然后当前线程才会继续往下运行

    viewDidLoad 在主线程中,也即dispatch_get_main_queue()中,执行到sync时向dispatch_get_main_queue()插入同步thread,sync会等到后面的block执行完成才返回。sync又

    在主队列里面,是个串行队列,sync是后面才加入的,前面一个是主线程viewDidLoad,所以sync想执行block必须等待前一个主线程viewDidLoad执行完成,而主线程

    viewDidLoad却在等待sync返回,才能去执行后续工作,从而造成死锁

  • 相关阅读:
    总结第十天
    总结第九天
    总结第八天
    总结第七天
    总结第六天
    总结第五天
    总结第四天
    总结第三天
    总结第二天
    每日站立会议(六)
  • 原文地址:https://www.cnblogs.com/huangzs/p/7469503.html
Copyright © 2020-2023  润新知