我有一个UICollectionView,显示从网络上检索的图像。它们是异步下载的。
当用户快速滚动时,他们会看到占位符,直到单元格加载为止。似乎UICollectionView只加载可见的内容。
有没有办法说“收集视图,在上下加载20个单元格”,所以当用户在不滚动的情况下查看内容时,加载更多单元格的机会更高?
答案 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
方法中提取图片。