日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

复杂列表的有效实现

發(fā)布時間:2025/3/19 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 复杂列表的有效实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近一直在做項目優(yōu)化,由于項目中有一個 xx墻 的列表界面,Cell的樣式復雜,與用戶的互動,cell變化也比較多,所以在實現(xiàn)上,代碼很臃腫,比較雜亂,日常的維護不是特別方便,隨著時間的推移,這個問題肯定越來越麻煩,所以一直在找神馬方法來有效的處理這個問題。

之后就找到了IGListKit這個庫,其實這個庫在很早之前就有所接觸,當時只是簡單的了解了一下,看了它能實現(xiàn)的東西,自己原生也能寫出來,就沒有去深入的學習它。現(xiàn)在再想想,是以前自己太幼稚了。

其實,IGListKit這個庫的目的性很強,它就是來解決一個布局復雜多樣,交互比較多的列表的編寫和維護難的問題,官方對其的描述是:A data-driven UICollectionView framework for building fast and flexible lists.,這也剛好,符合我的需求。

Diff

Diff 指的是在新舊的數(shù)據(jù)中,找出不同。IGListKit中,我覺得最后特色的地方,是它的 Diff 方案,IGListKit的 Diff 結(jié)合了Paul Heckel’s Diff(1978年)的一篇論文,進一步優(yōu)化,使用額外一些內(nèi)存空間,降低時間復雜度到O(n),并且能準確獲取所有Insert/Delete/Move操作。因此,IGListKit在更新列表內(nèi)容時,并不是對所有的cell進行reloadData(),而是使用Diff算法,計算出新舊數(shù)據(jù)的差異,然后使用performUpdates進行小范圍的insert/delete/move操作對數(shù)據(jù)發(fā)生變化的視圖進行更新。

如何使用

  • 創(chuàng)建 collectionView 和 adapter, 在 viewDidLayoutSubviews 中設置 collectionView.frame = view.bounds,設置 adapter 的 viewController 為 self,adapter 的 collectionView 為剛剛創(chuàng)建的 collectionView ,最后設置 adapter 的 dataSource 為 self;
  • 2.實現(xiàn) ListAdapterDataSource 的方法

    3. 從代碼中可以看出,數(shù)組中的元素必須要實現(xiàn) ListDiffable 協(xié)議,其目的是為了 Diff 運算。由于數(shù)組中的 String 類型的元素本身沒有實現(xiàn)此協(xié)議,故使用了 data.map { $0 as! ListDiffable }

    4. 之后就是根據(jù)數(shù)組中的元素的類型不同,返回不同的 SectionController, 不同的 SectionController 處理不同的類型的數(shù)據(jù)。其中,自定義的 SectionController 需要實現(xiàn) numberOfItems()、sizeForItem(at index: Int) -> CGSize、cellForItem(at index: Int) -> UICollectionViewCell、didUpdate(to object: Any) 4個方法,另外還可以重寫 ListSectionController 的其他方法來實現(xiàn)不同的需求,比如inset、space的設置、selected、highlight方法、以及supplementaryViewSource、displayDelegate、workingRangeDelegate、scrollDelegate這幾種很好用的delegate。

    部分說明

    下圖,挺形象的描述了 IGListKit 的實現(xiàn)(網(wǎng)絡圖片,借用一下)

  • 其中 adapter 的角色是一個中心調(diào)度器,它作為 UICollectionView的datasource ,每次都會從 sectionController 中獲取 cell,同時作為 UICollectionView 和 UIScrollView的delegate,負責向 sectionController回調(diào)。同時,adapter 對外提供 datasource 回調(diào),外界需要提供 data 數(shù)組、sectionController 的對象實例、以及 empty view。
  • SectionController 中的 collectionContext 實際就是就是 adapter,上兩者是相互引用的關(guān)系。
  • 上述的Demo也可以用 IGListKit 內(nèi)建的 ListBindingSectionController 來實現(xiàn),具體看實現(xiàn)開發(fā)來選擇用哪種。
  • IGListKit 內(nèi)建的 SectionController 還有 IGListSingleSectionController,可以構(gòu)建簡單的單個 cell 的 Section。
  • IGListKit 內(nèi)建的 SectionController 中的 IGListGenericSectionController,是在 IGListSectionController的基礎上,自動添加了一個屬性來存儲 ``didUpdateToObject:方法中的Object`
  • IGListKit 內(nèi)建的 SectionController 中的 ListStackedSectionController,是將多個 SectionController組合在一個 SectionController 中處理。
  • 參考

  • Diff應用:從LCS到UICollectionView
  • Getting Started Reference
  • 轉(zhuǎn)載于:https://juejin.im/post/5c271eefe51d4537427297c2

    總結(jié)

    以上是生活随笔為你收集整理的复杂列表的有效实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。