ios - 预填充 UICollectionView 单元重用队列

标签 ios objective-c performance uicollectionview

问题

我有一个带有单个 UICollectionView 的应用程序,它在我第一次滚动它时出现卡顿。我已将来源缩小到正在创建新单元格 (2)(使用 initWithFrame:)这一事实,因为周围没有可重复使用的单元格。在初始滚动之后,重用队列不为空,并且可以重用单元格并且没有卡顿。

黑客攻击

所以我已经能够在 iOS runtime headers 中的私有(private)方法的帮助下解决这个问题。 :

- (void)_reuseCell:(id)arg1;

我的假设是,这是将单元添加回重用队列的地方。使用这种未记录的方法的技巧如下所示:

int prefillCellCount = 10;
NSMutableArray *cells = [[NSMutableArray alloc] initWithCapacity:prefillCellCount];
for (int i=0; i<10prefillCellCount i++) {
    UICollectionViewCell *cell = [self.gridView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
    [cells addObject:cell];
}
for (UICollectionViewCell *cell in cells) {
    [self.gridView _reuseCell:cell];
}

破解有效!滚动时没有卡顿。

问题

我认为我无法通过此技巧通过 App Store 审核员。有没有办法在不使用未记录的方法的情况下做到这一点?如果不是,我唯一的办法就是混淆黑客攻击吗?

最佳答案

Is there a way to do this without the use of undocumented methods?

如果问题仅仅是创建单元格需要很长时间,那么您可以简单地创建一些额外的并在 View Controller 中保留它们,直到集合需要它们。预先分配一些单元格,就像您在代码中所做的那样,调用 dequeueReusableCellWithReuseIdentifier: 获取集合来为您创建它们。将它们保存在 View Controller 中的数组中。接下来,在您的 ...cellForItemAtIndexPath: 方法中,如果数组不为空,则从数组中删除一个单元格并使用它,而不是向 Collection View 询问可重用单元格。

这应该可以通过移动创建单元格的点而不使用任何未记录的方法来解决您的问题。

另一种方法是加快单元格创建过程,这样您就不必费心预先分配单元格。剖析您的代码以了解为什么您的单元格需要这么长时间来构建。也许您可以通过删除不必要的 View 来简化您的单元格结构?

关于ios - 预填充 UICollectionView 单元重用队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21877873/

相关文章:

ios - 如何跟踪 AVAudioFoundation 中的循环次数

mysql - 多对多关系性能

PHP:许多连接还是一个内爆?

ios - 将 "shared via iOS"更改为“通过 <AppName> 共享”

ios - 根据内容自动设置自定义 UIView 的高度?

ios - 知道 Realm Collection Change 通知中对象的哪个元素发生了变化?

objective-c - 通过 Web 服务将持久项目上传到磁盘

ios - 识别应用何时崩溃

ios - 如何检查整数值是否为 0 或者因为它为 null,所以将其值视为 0

java - 写入 XSSF Workbook 时,是什么导致我的程序陷入困境?