我有以下代码。我是否需要第二个dispatch_async
或者将在主线程上执行完成块,因为在主线程上调用了func2?
- (void)func1
{
dispatch_async(dispatch_get_main_queue(), ^() {
[self func2];
});
}
- (void)func2
{
[self.object someLongNetworkOperationWithCompletionBlock: ^() {
dispatch_async(dispatch_get_main_queue(), ^() {
// Update some UI elements here
});
}]
}
答案 0 :(得分:2)
这完全取决于实际方法someLongNetworkOperationWithCompletionBlock:
的实现。它调用参数块的任何队列都是它将运行的队列。如果您正在该方法中的后台队列上执行代码并希望它始终在main上调用该块,请将GCD调用直接放在该方法中。
执行此操作的方法的实现如下所示:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^()
{
// execute code on background queue
dispatch_async(dispatch_get_main_queue(), ^()
{
// call completion block on main
completion();
});
});