我有一个UICollectionView
,它显示的细胞部分是我需要从服务器获取的图像。在cellForItemAt
中,我检查我的缓存以查看图像是否可用,如果没有,我会调用一种方法来下载图像。
在该方法中,我异步加载图像。下载图像时,我检查与该图像关联的indexPath是否可见。如果是这样,我调用reloadItems来更新显示。
问题是我可以在模拟器上看到空单元格,但在可见单元格数组中不。
这是一个显示问题的最小代码段。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell: ThumbCell = collectionView.dequeueReusableCell(withReuseIdentifier: kReuseId, for: indexPath) as! PosterThumbCell
print("cellforItemAt: \(indexPath)")
print("visibleItems: \(collectionView.indexPathsForVisibleItems)")
...
return cell
}
现在我希望indexPath位于可见项数组中。但事实并非如此。是否有一些事件必须在项目被认为可见之前发生?我错过了什么?
答案 0 :(得分:0)
collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
来获取它随后将显示的单元格。因此,如果在从此函数返回之前打印可见单元格,则新出列的单元格将不在数组中。
要对此进行测试,请添加测试按钮并将打印从此数据源函数移动到按钮的处理程序。单元格显示后点击按钮,它将在数组中。
我不知道你的下载方法是什么样的,但你的骨架应该是这样的:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell: ThumbCell = collectionView.dequeueReusableCell(withReuseIdentifier: kReuseId, for: indexPath) as! PosterThumbCell
if let image = self.getImage(for: indexPath) {
cell.image = image
} else {
weak var weakCell = cell
self.loadImageFromServer(for: indexPath) { (image) in
// Should check that the cell is still used for the same IndexPath
weakCell?.image = image
}
}
return cell
}
分配图像(如果已下载),或者下载并在完成时分配。请注意,下载结束时,您在启动请求时使用的单元格可以重用于其他indexPath。有关详细信息,请查看此answer。