任何人都可以看到为什么此代码可以正常更新 UI 的原因:
__block NSDictionary *result = nil;
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[[SomeService sharedInstance] doSomethingGreatWithReplyBlock:^(NSDictionary * response) {
result = response;
dispatch_semaphore_signal(sema);
}];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_main_queue(), ^{
[self updateDisplay:result];
});
但是这个不会?
__block NSDictionary *result = nil;
[[SomeService sharedInstance] doSomethingGreatWithReplyBlock:^(NSDictionary * response) {
dispatch_async(dispatch_get_main_queue(), ^{
[self updateDisplay:response];
});
}];
这不完全一样吗?在第一个示例中,我正在等待异步操作使用信号量完成。然后 dispatch_async 在主队列上。
在第二个中,我直接从另一个块(在某个后台队列上运行)中调用 dispatch_async (也在主队列上)。这仍然可以很好地调用 updateDisplay 方法 - 但它实际上并没有更新 UI。感觉像是一些主线程更新问题但是 [NSThread isMainThread] 仍然返回 true...
我在这里缺少什么明显的区别吗?我在这里很迷茫,不胜感激。我以前从未观察到这种奇怪的行为。