繁体   English   中英

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 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM