如何告诉UICollectionView预加载更大范围的单元格?

时间:2013-10-01 21:02:16

标签: iphone ios uicollectionview

我有一个UICollectionView,显示从网络上检索的图像。它们是异步下载的。

当用户快速滚动时,他们会看到占位符,直到单元格加载为止。似乎UICollectionView只加载可见的内容。

有没有办法说“收集视图,在上下加载20个单元格”,所以当用户在不滚动的情况下查看内容时,加载更多单元格的机会更高?

3 个答案:

答案 0 :(得分:2)

想法是让VC识别何时可能需要远程加载并启动它。唯一棘手的部分是保持正确的状态,这样你就不会触发太多。

假设您的收藏是垂直的,您想了解的条件是:

BOOL topLoad = scrollView.contentOffset.y < M * scrollView.bounds.size.height

或何时

BOOL bottomLoad = scrollView.contentOffset.y > scrollView.contentSize.height - M * scrollView.bounds.size.height
换句话说,当我们从内容的边缘开始M“页面”时。但实际上,这种情况会被过度触发,例如您第一次加载时,或者如果您在scrollViewDidScroll上进行测试,则不希望为用户滚动的每个像素生成Web请求。

因此,正确使用视图控制器需要额外的状态。 vc可以有一对BOOL,如topLoadEnabled,bottomLoadEnabled,在视图准备好之前为NO。然后,滚动委托代码如下所示:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    // compute topLoad and bottomLoad conditions
    if (topLoad && self.topLoadEnabled) [self startTopLoad];
同样适用于底部。加载代码看起来像这样,抽象地:

self.topLoadEnabled = NO;  // don't trigger more loading until we're done
[self.model getMoreTopStuff:^(NSArray *newStuff, NSError *error) {

    // do view inserts, e.g. tableView.beginUpdates
    self.topLoadEnabled = YES;
}];

底部相同的想法。我们希望模型能够自己获取(可能模型有图像URL)并缓存结果(然后模型有图像)。作为视图的数据源,视图控制器被调用以配置视图单元。我可以天真地向模型询问图像。模型应该回答获取的图像或占位符。

希望这是有道理的。

答案 1 :(得分:2)

在我看来,你做出了错误的假设:单元格只是视图,因此你不应该将它们视为模型对象。 UICollectionView和UITableView非常高效,因为它们不断地回收单元格,因此您应该考虑在业务方面预加载内容。创建交互器或视图模型对象并使用这些对象填充数据源,然后您就可以要求这些对象预加载图像,如果您仍希望这样做。

答案 2 :(得分:0)

BOOL标志很少是答案。我倾向于估算合理的页面大小,并根据需要从cellForItemAtIndePath方法中提取图片。