0

任何人都可以看到为什么此代码可以正常更新 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...

我在这里缺少什么明显的区别吗?我在这里很迷茫,不胜感激。我以前从未观察到这种奇怪的行为。

4

0 回答 0