先从一道面试题开始:
- (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,相互等待。所有需要等主线程空闲时添加的任务均不会执行了。
网友评论