UICollectionViewCell 在 UICollectionView 内部会进行缓存,并在 Cell 滚出屏幕的时候对其复用,如果不了解复用机制,往往会遇到莫名其妙的问题。
一个简单的场景:在同一屏幕内,CollectionView 显示本地图片和网络图片,如果在本地图片显示之后,网络图片显示之前,调用 reload
的方法就会显示异常。
原因是 CollectionView 在页面没有滚动的情况下调用 reload
方法,不会重新创建 cell,而是用前面缓存的 cell 进行复用。和第一次显示不同的是,复用 cell 并没有拿它原先所在的 indexPath,而是 [0, 0] 下的 cell 复用了 [0, 3] 的 cell。
在 [0, 3] indexPath 的 cell 第一次出现的时候发起网络图片请求,而在请求完成之前reload
了一次,导致 [0, 3] 处的 cell 被复用在 [0, 0],当图片获取成功,显示在了 [0, 0] cell 上,从而替换了原来的本地图片。
为了避免出现这个问题,需要尽可能的减少 reload
整个 collectionView
,在必须要刷新的时候,可以将多处数据源的修改合并到一次 reload
。