了解以下代码

时间:2015-03-17 11:26:38

标签: ios multithreading grand-central-dispatch performselector dispatch-async

我刚试过以下代码

dispatch_async(dispatch_get_main_queue(), ^{
        [self taskB];
    });

[self performSelectorOnMainThread:@selector(taskA) withObject:nil waitUntilDone:NO];

taskAtaskB执行NSLog而没有其他任何内容。现在这里首先写taskBtaskA先执行。即使我改变了仍然performSelectorOnMainThread执行的订单。对于每种情况,我的控制台显示

2015-03-17 16:44:35.157 TestProject[9346:191978] Task A
2015-03-17 16:44:35.283 TestProject[9346:191978] Task B

任何人都可以帮我理解这里发生的事情。为什么performSelectorOnMainThread先执行?

3 个答案:

答案 0 :(得分:3)

dispatch_async(dispatch_get_main_queue(), ^{
        [self taskB];
    });

在此代码中,您使用dispatch_async告诉编译器不要暂停对其中编写的代码的进一步执行,因此编译器继续执行performSelectorOnMainThread然后编译器会考虑dispatch。 阅读有关Dispatch(GCD) here的更多信息。

答案 1 :(得分:2)

您正在使用dispatch_async启动异步任务,但不保证它会立即执行。

但另一方面,您要告诉您要执行任务A的主队列(通常是生命周期中的默认队列)。

因此,每当代码运行时,将异步跳过该块并继续执行任务A.在该任务结束后,任务B将异步启动。

答案 2 :(得分:0)