UICollectionView 的 99% CPU 使用率 - 显着位置更改未调用“didUpdateLocations”

Posted

技术标签:

【中文标题】UICollectionView 的 99% CPU 使用率 - 显着位置更改未调用“didUpdateLocations”【英文标题】:99% CPU usage of UICollectionView - Significant Location Change not calling "didUpdateLocations" 【发布时间】:2016-02-17 13:17:08 【问题描述】:

有效的是,应用程序会在位置发生重大变化时启动到后台。在AppDelegate 中,我检查UIApplicationLaunchOptionsLocationKey 并初始化位置管理器:

locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
locationManager.distanceFilter = 50
locationManager.allowsBackgroundLocationUpdates = true
locationManager.startMonitoringSignificantLocationChanges()

初始视图控制器是UITabBarController,它显示UICollectionViewController

当我设置 UICollectionView 中没有单元格时,一切正常,locationManagerdidUpdateLocations 被调用。

但是,当 UICollectionViewnumberOfItemsInSection 返回 1 时,didUpdateLocations 不会被调用。相反,UICollectionView 的 CPU 使用率为 99%,持续几分钟,直到应用崩溃。

我从单元格中删除了所有控件和所有代码,所以它现在是一个空单元格,但仍然会发生这种情况。

在 Time Profiler 中,我发现这与 UICollectionViewData setLayoutAttributes 有关。

这里有什么问题?

更新一:setLayoutAttributes下有栈。

更新 2:应用运行良好,用户正常启动时从未崩溃。

【问题讨论】:

【参考方案1】:

你比这个网站上的任何人都更了解代码,但是这看起来很可疑:

您正在通过观察者运行某种循环,无论它们是什么。 看起来每一个它都在做一个回调,那是在做某种需要提交的事务,作为提交的一部分,它正在显示一些东西,作为其中的一部分,它正在做一堆布局,子视图等。 这基本上是所有时间。

您可能希望在完成之前关闭显示更新。

【讨论】:

嗨,迈克,感谢您的调查,我没有打电话给任何观察员,但我找到了解决方案,请参阅上面的答案。【参考方案2】:

有趣的是,解决方案是禁用一次重大的位置更改并运行应用程序:

locationManager.allowsBackgroundLocationUpdates = false
locationManager.stopMonitoringSignificantLocationChanges()

重新启用并运行应用程序后,它运行良好:

locationManager.allowsBackgroundLocationUpdates = true
locationManager.startMonitoringSignificantLocationChanges()

我尝试了一切,从删除 3rd 方框架到将应用程序精简到最少的代码,是的,我还清理了构建文件夹 100 次。

ios 应用程序注册可能有问题,以通知重大位置变化。希望这可以节省我弄清楚这一点所花费的时间。

【讨论】:

以上是关于UICollectionView 的 99% CPU 使用率 - 显着位置更改未调用“didUpdateLocations”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MATLAB 中计算 99% 的覆盖率?

准确率 99%,分类不正确 - 三元网络

RDS 实例 CPU 为 99%

程序人生 - 为什么下载,经常会卡在99%?

99%的网站JavaScript插件面临攻击风险

Android 开发者“将新 APK 上传到生产环境 99% 完成”并卡住