我在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编译所有内容。
是否有人已经有过这种行为,可能会指出我可能阻止的方向?
答案 0 :(得分:0)
因此,经过一些研究后我发现了这个问题。我从后端通知后台线程(通过NSNotificationCenter
),并从两个不同的ViewController获取此通知以更新UITableViews的数据源。第二个(挂起的)位于第一个下面的NavigationController层次结构中。
两个通知都会在同一时间处理,并且UI会在两个控制器上重新加载,即使第一个通知根本不可见。但这似乎恰好发生在iOS 7上。所有iOS版本都没有从看不见的ViewController重新加载UI。
当我在ViewControllers之间跳转时,UI上的所有内容都会被更新,因为数据源是从后台线程更新的,所以我只是通过检查现在显示哪个展位ViewControllers来解决问题。只重新加载那个UI。
让我感到困惑的是,iOS 7以上的所有iOS版本似乎都会自动处理这个问题,但iOS 7并没有。