预填充UICollectionView单元重用队列

时间:2014-02-19 10:34:43

标签: ios objective-c performance uicollectionview

问题

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

黑客

所以我已经能够借助iOS runtime headers中的私有方法来解决问题:

- (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评论员。有没有办法在不使用未记录的方法的情况下做到这一点?如果没有,我唯一的办法就是混淆黑客攻击?

1 个答案:

答案 0 :(得分:6)

  

有没有办法在不使用未记录的方法的情况下做到这一点?

如果问题只是创建单元格需要很长时间,那么您只需创建一些附加内容并在视图控制器中保留它们,直到集合要求它们为止。您已经在代码中预先分配了一些单元格,调用dequeueReusableCellWithReuseIdentifier:来获取集合以便为您创建它们。将它们保存在视图控制器中的数组中。接下来,在...cellForItemAtIndexPath:方法中,如果数组不为空,则从数组中删除一个单元格并使用它而不是向集合视图询问可重用单元格。

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

另一种方法是加快细胞创建过程,这样您就不必费心预先分配细胞。描述您的代码,看看为什么您的细胞需要很长时间才能构建。也许你可以通过删除不必要的视图来简化你的单元结构?