dispatch_async(dispatch_get_main_queue(), ^{});来自 iOS7 上的后台线程缓慢

dispatch_async(dispatch_get_main_queue(), ^{}); from Background Thread slow on iOS7

我在 iOS7 上发现了一个奇怪的行为。我有一个处理重负载的 dispatch_async 后台线程,我想从这个线程更新 UI。所以我做了如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

    [self heavyFunction];

    dispatch_async(dispatch_get_main_queue(), ^{

        [self updateUI];

    });
});

在 iOS 8 及以上代码按建议工作,但 运行 在 iOS7 测试设备(iPhone 4 秒)上调用 dispatch_async(dispatch_get_main_queue(), ^{}); 每次需要 4 秒。我已经将更新和 heavy_function 取出,但仍然出现相同的行为。然后我建立了一个最小的例子,它没有出现。所以我想也许其他东西在 iOS7 上阻止了我的 main_queue 但我不知道这应该是什么。在 [self heavyfunction]; 完成之前,此 ViewController 上不会发生其他 UI 相关的事情。

所有内容均使用 XCode 7.3.1 与 Base SDK 9.3 和 Deployment Target 7.0 编译。

有没有人已经有过这种行为并且可以指出我可能在这里阻塞的方向?

所以,经过一番研究,我发现了问题所在。我使用来自后端的通知(通过 NSNotificationCenter)调用后台线程,并且从两个不同的 ViewController 中捕获此通知以更新 UITableView 的数据源。第二个(挂起的那个)在第一个下面的 NavigationController 层次结构中。

两个通知同时处理并且 UI 在两个控制器上重新加载,即使第一个通知根本不可见。但这似乎只发生在 iOS 7 上。所有以上 iOS 版本似乎都不会从不可见的 ViewController 重新加载 UI。

当我在 ViewController 之间跳转时,UI 上的所有内容都会以任何一种方式更新,因为数据源是从后台线程更新的,所以我通过检查哪一个线程解决了这个问题展位 ViewControllers 现在显示,只重新加载那个 UI。

仍然让我感到困扰的是 iOS 7 以上的所有 iOS 版本似乎都自动处理了这个问题,但是 iOS 7 没有。