直接上代码
在主线程,比如vc 的viewDidLoad方法中运行如下代码
NSLog(@"1");
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
NSLog(@"2");
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
NSLog(@"3");
});
NSLog(@"5");
});
NSLog(@"4");
查看打印情况如下
这个是dispatch_sync()的执行逻辑,同步执行,即当前函数执行到这个方法时,需要等待该方法插入的任务执行完才会继续向下执行。
改为dispatch_async()执行
NSLog(@"1");
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"2");
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"3");
});
NSLog(@"5");
});
NSLog(@"4");
打印结果变成
异步执行,即当前函数执行到这个方法,不需要等待该方法插入的任务执行完
还有一个比较特殊的情况,如果改为在主队列中同步执行
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue, ^{
NSLog(@"2");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"3");
});
NSLog(@"5");
});
NSLog(@"4");
执行会报错
原因是形成死锁了。主线程里面同步执行,当前函数需要等待插入的任务执行完才会继续往下执行,但是主队列是串行队列,必须等当前函数执行完,才会去执行主队列里面的任务。两个任务互相等待,形成死锁