复杂列表的有效实现
最近一直在做項目優化,由于項目中有一個 xx墻 的列表界面,Cell的樣式復雜,與用戶的互動,cell變化也比較多,所以在實現上,代碼很臃腫,比較雜亂,日常的維護不是特別方便,隨著時間的推移,這個問題肯定越來越麻煩,所以一直在找神馬方法來有效的處理這個問題。
之后就找到了IGListKit這個庫,其實這個庫在很早之前就有所接觸,當時只是簡單的了解了一下,看了它能實現的東西,自己原生也能寫出來,就沒有去深入的學習它。現在再想想,是以前自己太幼稚了。
其實,IGListKit這個庫的目的性很強,它就是來解決一個布局復雜多樣,交互比較多的列表的編寫和維護難的問題,官方對其的描述是:A data-driven UICollectionView framework for building fast and flexible lists.,這也剛好,符合我的需求。
Diff
Diff 指的是在新舊的數據中,找出不同。IGListKit中,我覺得最后特色的地方,是它的 Diff 方案,IGListKit的 Diff 結合了Paul Heckel’s Diff(1978年)的一篇論文,進一步優化,使用額外一些內存空間,降低時間復雜度到O(n),并且能準確獲取所有Insert/Delete/Move操作。因此,IGListKit在更新列表內容時,并不是對所有的cell進行reloadData(),而是使用Diff算法,計算出新舊數據的差異,然后使用performUpdates進行小范圍的insert/delete/move操作對數據發生變化的視圖進行更新。
如何使用
2.實現 ListAdapterDataSource 的方法
3. 從代碼中可以看出,數組中的元素必須要實現 ListDiffable 協議,其目的是為了 Diff 運算。由于數組中的 String 類型的元素本身沒有實現此協議,故使用了 data.map { $0 as! ListDiffable } 4. 之后就是根據數組中的元素的類型不同,返回不同的 SectionController, 不同的 SectionController 處理不同的類型的數據。其中,自定義的 SectionController 需要實現 numberOfItems()、sizeForItem(at index: Int) -> CGSize、cellForItem(at index: Int) -> UICollectionViewCell、didUpdate(to object: Any) 4個方法,另外還可以重寫 ListSectionController 的其他方法來實現不同的需求,比如inset、space的設置、selected、highlight方法、以及supplementaryViewSource、displayDelegate、workingRangeDelegate、scrollDelegate這幾種很好用的delegate。部分說明
下圖,挺形象的描述了 IGListKit 的實現(網絡圖片,借用一下)
參考
轉載于:https://juejin.im/post/5c271eefe51d4537427297c2
總結
- 上一篇: 性能优化 内存 渲染 存取 时间
- 下一篇: 几种排序算法