簡體   English   中英

調用UICollectionView.reloadData()是不是很糟糕? 如果是這樣,為什么?

[英]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中得到了詳細闡述

Apple Link

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

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

reloadDatareloadItemsAtIndexPaths將僅導致為具有關聯的可見單元格的行重新創建和重新顯示單元格。

所以,既然可見細胞的數量通常不發生變化,通常是 (例如,5至20最大),整體工作呈現細胞始終保持恆定 ,並獨立於數據模型中的項目數。

reloadItemsAtIndexPaths (有選擇地重新呈現指定的可見單元格)相反, reloadData將更新所有當前可見的單元格,並在模型的項目數量發生更改時更新基礎視圖和關聯視圖(例如,調整滾動條和視圖的高度) )。

出於性能原因,您可以使用reloadItemsAtIndexPaths - 但通常不需要 - 並且通常不建議這樣做,因為它還需要關注代碼中其他位置的項目數。

這不僅僅在collectionView中的reload方法中。 但與Tableview相同的問題。 我不知道你是否知道tableviewcollectionView的重載方法。我正在解釋無意中聽到的。

當你調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM