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 中没有单元格时,一切正常,locationManager
的 didUpdateLocations
被调用。
但是,当 UICollectionView
的 numberOfItemsInSection
返回 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”的主要内容,如果未能解决你的问题,请参考以下文章