主线程和主队列

先从一道面试题开始:

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

程序怎么执行?
答案是:控制台只打印2。

在程序执行到dispatch_async

dispatch_async(dispatch_get_main_queue(), ^{
    NSLog(@"1");
});

意思是,当主线程空闲的时候,需要将NSLog1的任务添加到主队列中,但此时,主线程中还有NSLog2的任务。于是,该任务并没有加入到主队列中,而是去先执行NSLog2,NSLog2后依然有任务。
dispatch_sync是让当前线程立即执行当前队列中的任务,但是当前队列需要等待主线程空闲才能添加任务,此时主线程并不空闲,so,相互等待。所有需要等主线程空闲时添加的任务均不会执行了。

你可能感兴趣的:(主线程和主队列)