記一次崩潰記錄: collectionView 的 reloadSection 意外崩潰

崩潰記錄

'Invalid update: invalid number of sections. The number of sections contained in the collection view after the update (7) must be equal to the number of sections contained in the collection view before the update (9), plus or minus the number of sections inserted or deleted (1 inserted, 1 deleted).'複製代碼

 問題發現. 在collectionview 中有個需求須要點擊 刷新某個單獨的 section , 出於性能的考慮,選擇了

`self.collectionView.reloadSections(IndexSet(integer:sender.tag))`
這個方法, 可是後臺監聽發現有 carsh ,思索以後發現,reloadSections不單單是刷新當前行, 還會調用當前行以前和以後的 section 數據, 當發生數據不一致時候,就會發生 carsh

解決方案

google 一番以後 , 發現廣泛推薦這個解決方案,
``` collectionView.performBatchUpdates({ UIView.performWithoutAnimation { self.collectionView.reloadSections(IndexSet(integer:sender.tag)) } }) { (success) in } ```

使用這個方法, 能夠 collectionView 暫時鎖定 collectionView 的數據,相似 tableview 的 beginData, 或者 enddata 方法緩存

手動試了一下 異步刪除數據,在performBatchUpdates 方法中 刷新section, 發現仍是會報出崩潰
再見👋, performBatchUpdates
這裏推薦使用這種,
 self.collectionView.reloadData() self.collectionView.collectionViewLayout.invalidateLayout()

核心方法是這個 invalidateLayout()bash

將collectionViewLayout 的緩存信息銷燬, 從新生成 layout異步

這樣就不會出現, 數據不一致,而後致使崩潰的問題了.
以上是個人解決方案,要是你有更好的,能夠告訴我哈 
相關文章
相關標籤/搜索