如何告诉UICollectionView预加载更大范围的单元格?
我有一个UICollectionView,它显示从网上检索的图像。 他们被下载异步。
当用户快速滚动时,他们会看到占位符,直到单元格加载。 看来UICollectionView只加载可见的内容。
有没有办法说“收集视图,加载20个以上和以下的单元格”,所以机会更高,它加载更多的单元格,而用户正在看内容而不滚动?
这个想法是让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)并缓存结果(然后模型具有图像)。 作为视图的数据源,视图控制器被调用来配置视图单元格。 我可以天真地问模型的图像。 该模型应该回答提取的图像或占位符。
希望这是有道理的。
在我看来,你正在做出错误的假设:单元格只是视图,所以你不应该把它们当作模型对象。 UICollectionView和UITableView非常高效,因为它们不断循环使用单元,所以您应该考虑在事务的业务方面预加载内容。 创建交互视图对象或视图模型对象并使用这些对象填充数据源,然后如果您仍希望这样做,则可以请求这些对象预先加载图像。
BOOL标志很少是答案。 我宁愿去估计合理的页面大小,并根据需要从cellForItemAtIndePath
方法获取图像。
上一篇: How to tell UICollectionView to preload a larger range of cells?