我的代码很少如下:
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"1");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"3");
});
NSLog(@"2");
}
在控制台中,控制台输出为:1, 2, 3
。起初我认为它应该是1, 3, 2
因为dispatch_get_main_queue
是主队列,而在它之外也是主队列。为什么输出不同?
答案 0 :(得分:3)
dispatch_async
表示"提交此块以在该队列能够执行时在指定队列上运行,但不要阻止等待调度块完成的当前线程,而是立即继续。"并且由于viewDidLoad
正在主线程上运行,主线程将在运行您异步调度到主队列的块之前完成运行viewDidLoad
。
答案 1 :(得分:1)
使用 dispatch_async 在NSLog(3)中调度代码,这将使它在当前同步函数完成后异步执行。
我建议阅读一般关于线程和GCD的教程,因为SO并不能完全涵盖这一点。