dispatch_get_main_queue块内的代码

时间:2018-04-23 14:54:12

标签: ios objective-c grand-central-dispatch dispatch-async

我的代码很少如下:

- (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是主队列,而在它之外也是主队列。为什么输出不同?

2 个答案:

答案 0 :(得分:3)

dispatch_async表示"提交此块以在该队列能够执行时在指定队列上运行,但不要阻止等待调度块完成的当前线程,而是立即继续。"并且由于viewDidLoad正在主线程上运行,主线程将在运行您异步调度到主队列的块之前完成运行viewDidLoad

答案 1 :(得分:1)

使用 dispatch_async 在NSLog(3)中调度代码,这将使它在当前同步函数完成后异步执行。

我建议阅读一般关于线程和GCD的教程,因为SO并不能完全涵盖这一点。