dispatch_async(dispatch_get_main_queue(),^ {});从iOS7背景线程慢

时间:2016-09-07 10:03:45

标签: ios objective-c multithreading grand-central-dispatch

我在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 4s)上运行,每次调用dispatch_async(dispatch_get_main_queue(), ^{});需要4秒。我已经完成了更新和重功能,同样的行为仍然出现。然后我建立了一个最小的例子,它没有出现。所以我想也许其他东西在iOS7上阻止了我的main_queue,但我无法弄清楚它应该是什么。在[self heavyfunction];完成之前,此ViewController上没有其他与UI相关的内容。

使用基本SDK 9.3和部署目标7.0的XCode 7.3.1编译所有内容。

是否有人已经有过这种行为,可能会指出我可能阻止的方向?

1 个答案:

答案 0 :(得分:0)

因此,经过一些研究后我发现了这个问题。我从后端通知后台线程(通过NSNotificationCenter),并从两个不同的ViewController获取此通知以更新UITableViews的数据源。第二个(挂起的)位于第一个下面的NavigationController层次结构中。

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

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

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