ios - layoutattributesforelements




調用UICollectionView.reloadData()不好的做法? 如果是這樣,為什麼? (4)

reloadDatareloadItemsAtIndexPaths只會導致重新創建並重新顯示具有關聯的可見單元格的行的單元格。

因此,由於可見單元格的數量通常不會改變,並且通常很小 (例如,最大為5到20),所以呈現單元格的總體工作總是保持不變,並且與數據模型中的項目數量無關。

reloadItemsAtIndexPaths相比, reloadItemsAtIndexPaths有選擇性地重新渲染指定的可見單元格, reloadData將更新所有當前可見的單元格,並在模型的項目數量發生變化時更新底層視圖和關聯的視圖(例如調整視圖的滾動條和高度)。

出於性能方面的考慮,您可能會使用reloadItemsAtIndexPaths - 但通常情況下,這不是必需的 - 而且通常不建議使用,因為它需要考慮代碼中其他位置的項目數量。

我和一位出色的開發人員合作過,他們多多少少拒絕在UICollectionView上調用reloadData()

他甚至不贊成collectionView.reloadItemsAtIndexPaths(collectionView.indexPathsForVisibleItems()) ,寧願只重新加載需要視覺更新的確切的索引路徑。

我從他那裡拿起這個,但是我正在努力思考一個通用的reloadData()會帶來什麼樣的問題。 當然,如果你有重新加載觸發的昂貴的副作用,那是一回事。 但是,如果您的數據源本身只是掛出,為什麼不reloadData()作為一個易於reloadData()方式更新集合視圖?

這種做法會造成什麼問題?


作為一個普遍的拒絕,我認為這是誇張的。 如果表格很大,並且這些項目的創建成本很高,則會有一些性能提升。 如果每行的項目數量可能有所不同,並且您重新加載了500個項目中的項目#317,則您知道前面所有行中的項目數量沒有變化,因此您無需重新計算該項目。 但是,如果你只有20個項目,通常沒有什麼區別。


這只是給你一些性能增益。 如果你有很多的項目,然後重新加載一些項目,你不必重新加載整個CollectionView。 但是,如果你有幾件物品,那就不是那麼昂貴。

問題在於,對於一些項目來說這只是一個很小的性能提升。 但這是一個很好的做法。 所以,選擇是你的。


不,這根本不是一個壞習慣。

只是一個簡短的概述,所以你得到你的答案

UICollectionView是高度優化的,因此只保留在屏幕上可見的內存行。 現在,所有行單元格被緩存在池中,並且被重用並且不被重新生成。 每當用戶滾動UICollectionView時,它會在池中添加剛才隱藏的行,並將它們重新用於下一個可見的行。

因此,當您調用reloadData()時,它只是更新行單元格中的數據,例如更新UILabel文本,更新僅針對可見單元格進行,並且過程繼續。

現在,考慮你的集合視圖中有10行可見,並在調用

reloadItemsAtIndexPaths(collectionView.indexPathsForVisibleItems())

你只需簡單地為這些項目更新UILabel類似的元素,但是如果你調用reloadData(),你更新了十個可見項目的數據,這是沒有什麼區別的,因為它是一個非常輕的過程。

你應該在任何地方使用reloadData()。 保持簡單和可讀性。 性能明智,reloadItems沒有任何區別。

它在Apple Docx中得到了很好的闡述

蘋果鏈接

調用此方法重新加載集合視圖中的所有項目。 這將導致集合視圖丟棄任何當前可見的項目並重新顯示它們。 為了提高效率,收集視圖僅顯示可見的單元格和補充視圖。 如果收集數據由於重新加載而收縮,則收集視圖會相應地調整其滾動偏移量。





uicollectionview