UICollectionView的99%CPU使用率 - 重要位置更改未调用" didUpdateLocations"

时间:2016-02-17 13:17:08

标签: uicollectionview uikit profiling core-location cllocationmanager

有效的是,应用程序会在重要位置更改时启动。在AppDelegate中,我检查UIApplicationLaunchOptionsLocationKey并初始化位置管理员:

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

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

当我设置UICollectionView中没有单元格时,一切正常,didUpdateLocations的{​​{1}}被调用。

但是,当locationManager' UICollectionView返回1时,numberOfItemsInSection不会被调用。相反,在应用程序崩溃之前,didUpdateLocations的CPU占用率为99%。

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

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

Call stack in Time Profiler

这里有什么问题?

更新1: UICollectionViewData setLayoutAttributes下有一个堆栈。

enter image description here

更新2:该应用正常运行,并且在用户正常启动时从未崩溃。

2 个答案:

答案 0 :(得分:0)

您比本网站上的任何人都更了解代码,这看起来很可疑:

enter image description here

你在Observers上运行某种循环,无论那是什么。 看起来每个人都在做一个回调,那就是做某种需要提交的事务,并且作为提交的一部分,它正在显示一些内容,并且作为其中的一部分,它正在做一堆布局,子视图等。 那时间基本上都在消耗所有

您可能需要关闭显示更新,直到完成为止。

答案 1 :(得分:0)

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

locationManager.allowsBackgroundLocationUpdates = false
locationManager.stopMonitoringSignificantLocationChanges()

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

locationManager.allowsBackgroundLocationUpdates = true
locationManager.startMonitoringSignificantLocationChanges()

我尝试了一切,从删除第三方框架到删除应用程序到最少的代码,是的,我也做了100次清理构建文件夹。

iOS应用程序注册表可能出现问题,通知重要的位置更改。希望这可以节省一些人花费时间来解决这个问题。