在我的应用程序中,我有一个选择模式,允许选择UICollectionView中的单元格,然后将其用于各种操作。启用选择模式时,我刷新可见单元格,以便显示选择模式指示符。单元格的大小保持不变,并在设置UICollectionView's布局时设置为硬编码值(以及节头大小)。
我的UICollectionView将它的项组织成部分,使用NSFetchedResultsController作为底层数据源。NSFetchedResultsController使用节名称值。使用NSFetchedResultsController获取的核心数据包含许多实体(有时超过100,000)和部分(有时超过5,000)。
这方面的核心数据方面工作得很好-获取有点昂贵,但总体上是合理的。我没有设置一个获取限制FWIW (但这样做,即使是抓取大小为25,我没有看到性能上的差异)。
尽管具有良好的核心数据性能,但当我进入选择模式时,我会体验UI滞后/冻结。我做了一些分析,我看到当我进入选择模式时,每个部分都会调用numberOfItemsInSection方法。因此,应用程序有时调用numberOfItemsInSection 5000次时,进入选择模式!每个单独的调用都是相对轻量级的,但根据推断,每5000次调用都会导致明显的UI滞后/冻结。UICollectionViewController似乎将此作为其布局/更新视图逻辑的一部分,但我不知道为什么它需要了解所有的部分.
我想知道为什么在我的UICollectionView控制器中使用节时,我必须为每个部分调用numberOfItemsInSection --大小应该是一致的,那么为什么要重新布局视图呢?
发布于 2017-03-28 18:40:05
我不知道为什么对reloadItemsAtIndexPaths的调用会导致集合视图更新它的节项计数。
一个可能的解决办法是:确保获取的结果控制器正在缓存节数据,以避免在没有对存储进行更改的情况下需要昂贵查询的这些项计数。
初始化结果控制器的实例时,通常会指定缓存名。(如果不指定缓存名称,则控制器不会缓存数据。)创建控制器时,它会查找具有给定名称的现有缓存.
https://developer.apple.com/reference/coredata/nsfetchedresultscontroller#1661453
https://stackoverflow.com/questions/43056814
复制相似问题