[英]UICollectionView.reloadData() do NOT trigger UICollectionDataSource methods
[英]Is calling UICollectionView.reloadData() bad practice? If so, why?
我曾與一位出色的開發人員合作過,他或多或少拒絕在UICollectionView
上調用reloadData()
。
他甚至對collectionView.reloadItemsAtIndexPaths(collectionView.indexPathsForVisibleItems())
不滿意,而是僅重新加載需要可視更新的精確索引路徑。
我從他那里挑選了這個,但我很難想到通用reloadData()
特別會導致什么問題。 當然,如果你有重新加載觸發的昂貴的副作用,這是一回事。 但是,如果您的數據源本身只是reloadData()
,那么為什么不將reloadData()
作為一種簡單的編碼方式來更新集合視圖呢?
這種做法會帶來什么問題?
不,這根本不是一個壞習慣。
只是一個簡短的概述,所以你得到你的答案
UICollectionView經過高度優化,因此只在內存中保留屏幕上可見的行。 現在,所有行單元格都緩存在池中並被重用而不是重新生成。 每當用戶滾動UICollectionView時,它會在Pool中添加剛剛隱藏的行,並重新使用它們作為可見行。
因此,當您調用reloadData()時,它只是更新行單元格中的數據,例如更新UILabel文本,並且僅針對可見單元格進行更新,並且該過程繼續進行。
現在,假設您在集合視圖中和調用時有十行可見
reloadItemsAtIndexPaths(collectionView.indexPathsForVisibleItems())
您只需更新UILabel類似於元素的元素,但如果您調用reloadData(),則更新十個可見項目的數據,這沒有任何區別,因為它是一個非常輕的過程。
你應該在任何地方使用reloadData()。 保持簡單易讀。 性能方面,reloadItems沒有任何區別。
它在Apple Docx中得到了詳細闡述
調用此方法可重新加載集合視圖中的所有項目。 這會導致集合視圖丟棄任何當前可見的項目並重新顯示它們。 為了提高效率,集合視圖僅顯示可見的單元格和補充視圖。 如果集合數據由於重新加載而縮小,則集合視圖會相應地調整其滾動偏移。
作為一般拒絕,我認為這是誇大其詞。 如果表很大,並且如果項目的創建成本很高,則會有一些性能提升。 如果每行的項目數可能不同,並且您從500個項目中重新加載項目#317,那么您就知道前面所有行中的項目數沒有變化,因此您無需重新計算。 但如果你只有20件物品,那通常沒什么區別。
reloadData
和reloadItemsAtIndexPaths
將僅導致為具有關聯的可見單元格的行重新創建和重新顯示單元格。
所以,既然可見細胞的數量通常不發生變化,通常是小 (例如,5至20最大),整體工作呈現細胞始終保持恆定 ,並獨立於數據模型中的項目數。
與reloadItemsAtIndexPaths
(有選擇地重新呈現指定的可見單元格)相反, reloadData
將更新所有當前可見的單元格,並在模型的項目數量發生更改時更新基礎視圖和關聯視圖(例如,調整滾動條和視圖的高度) )。
出於性能原因,您可以使用reloadItemsAtIndexPaths
- 但通常不需要 - 並且通常不建議這樣做,因為它還需要關注代碼中其他位置的項目數。
這不僅僅在collectionView
中的reload方法中。 但與Tableview
相同的問題。 我不知道你是否知道tableview
和collectionView
的重載方法。我正在解釋無意中聽到的。
當你調用reload
方法時。 操作系統檢查所有visible
單元格。 並為所有單元cellForRow
方法。 這意味着你的代碼執行額外的事情。 這是不必要的。 因此,調用reloadItemsAtIndexPaths
僅重新加載需要更新的單元格是完美的方法。
假設你的collectionView
有20個可見單元格。 具有在cellForRow
方法中設置的圖像。 現在你想在單元格11更新圖像。如果你調用reload方法,那么cellForRow
將調用每個單元格。 但是如果你使用reloadItemsAtIndexPaths
並且只使用一個indexPath
那么它只會執行一次用於單元格11的cellForRow
。
它只是給你一些性能提升。 如果你有很多項目然后重新加載一些項目,你不必重新加載整個CollectionView。 但如果你的產品很少,那就不那么貴了。
問題是,對於少數項目來說,這是一個很小的性能提升。 但這是一個很好的做法。 所以,選擇是你的。
如果為數據中的每一個小變化調用reloadData
可能被認為是不好的做法。 調用reloadData
,將重新創建單元格,不能保證每個可見數據項在reloadData
之后都會獲得相同的單元格。 實際上他們通常不會。 這意味着如果您在單元格中長時間運行操作(如動畫或觸摸識別器),如果您不了解發生的情況,它們可能會產生大量難以追蹤的錯誤。
在將數據收集更改為表時,需要使用reloadData
刷新UITableView / UICollectionView視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.