![](/img/trans.png)
[英]Purpose of running dispatch_async(dispatch_get_main_queue() on UI Thread
[英]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 4s)上运行对dispatch_async的调用dispatch_async(dispatch_get_main_queue(), ^{});
每次需要4秒钟。 我已经完成了更新和重功能,同样的行为仍然出现。 然后我建立了一个最小的例子,它没有出现。 所以我想也许其他东西阻止我在iOS7上的main_queue,但我无法弄清楚这应该是什么。 在[self heavyfunction];
之前,这个ViewController上没有其他UI相关的东西发生[self heavyfunction];
饰面。
所有内容都使用XCode 7.3.1与Base SDK 9.3和Deployment Target 7.0进行编译。
有没有人已经有过这种行为,可能会指出我可能阻止的方向吗?
因此,经过一些研究后我发现了这个问题。 我从后端通过后台线程调用通知(通过NSNotificationCenter
),并从两个不同的ViewController获取此通知以更新UITableViews的数据源。 第二个(挂起的)位于第一个下面的NavigationController层次结构中。
两个通知都会在同一时间处理,并且UI会在两个控制器上重新加载,即使第一个通知根本不可见。 但这似乎恰好发生在iOS 7上。所有上述iOS版本都没有从看似无形的ViewController重新加载UI。
当我在ViewControllers之间跳转时,UI上的所有内容都以任何方式更新,因为数据源从后台线程更新,所以我通过检查现在显示哪个展位ViewControllers并仅重新加载UI来解决问题。
仍然让我感到困惑的是,iOS 7以上的所有iOS版本似乎都会自动处理这个问题,但iOS 7却没有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.