我刚试过以下代码
dispatch_async(dispatch_get_main_queue(), ^{
[self taskB];
});
[self performSelectorOnMainThread:@selector(taskA) withObject:nil waitUntilDone:NO];
此taskA
和taskB
执行NSLog
而没有其他任何内容。现在这里首先写taskB
但taskA
先执行。即使我改变了仍然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
先执行?
答案 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)