UICollectionViewCell 在 UICollectionView 內(nèi)部會(huì)進(jìn)行緩存,并在 Cell 滾出屏幕的時(shí)候?qū)ζ鋸?fù)用,如果不了解復(fù)用機(jī)制,往往會(huì)遇到莫名其妙的問題。
一個(gè)簡(jiǎn)單的場(chǎng)景:在同一屏幕內(nèi),CollectionView 顯示本地圖片和網(wǎng)絡(luò)圖片,如果在本地圖片顯示之后,網(wǎng)絡(luò)圖片顯示之前,調(diào)用 reload 的方法就會(huì)顯示異常。

原因是 CollectionView 在頁面沒有滾動(dòng)的情況下調(diào)用 reload方法,不會(huì)重新創(chuàng)建 cell,而是用前面緩存的 cell 進(jìn)行復(fù)用。和第一次顯示不同的是,復(fù)用 cell 并沒有拿它原先所在的 indexPath,而是 [0, 0] 下的 cell 復(fù)用了 [0, 3] 的 cell。
在 [0, 3] indexPath 的 cell 第一次出現(xiàn)的時(shí)候發(fā)起網(wǎng)絡(luò)圖片請(qǐng)求,而在請(qǐng)求完成之前reload 了一次,導(dǎo)致 [0, 3] 處的 cell 被復(fù)用在 [0, 0],當(dāng)圖片獲取成功,顯示在了 [0, 0] cell 上,從而替換了原來的本地圖片。
為了避免出現(xiàn)這個(gè)問題,需要盡可能的減少 reload 整個(gè) collectionView,在必須要刷新的時(shí)候,可以將多處數(shù)據(jù)源的修改合并到一次 reload。