寫在前面
IGListKit 是一個數(shù)據(jù)驅(qū)動的UICollectionView框架闭翩,用于構(gòu)建快速靈活的列表弦追,可以有效避免了使用UICollectionView產(chǎn)生的大量試圖控制器,降低耦合度,提高靈活性,在一定程度上可以降低后期維護(hù)成本缰趋。
通過這個框架,您可以提供一系列在UICollectionView中顯示的對象铛只。 對于每種類型的對象埠胖,適配器創(chuàng)建一個名為section controller的內(nèi)容,該控件具有創(chuàng)建單元格的所有細(xì)節(jié)淳玩。
IGListKit會自動分辨對象直撤,并在UICollectionView上執(zhí)行動畫批量更新以進(jìn)行任何更改。 這樣就不必自己編寫批量更新蜕着,避免在這里列出的問題谋竖,從而可以更專注于數(shù)據(jù)邏輯的代碼上。
IGListKit的刷新時機(jī)
既然說IGListKit是一個數(shù)據(jù)驅(qū)動的UICollectionView框架承匣,那它的刷新當(dāng)然就是由數(shù)據(jù)來決定的了蓖乘。
當(dāng)數(shù)據(jù)發(fā)生變化時,相應(yīng)的sectionViewController就可以根據(jù)數(shù)據(jù)是否有變化作出刷新處理韧骗。
在IGListKit框架的Model中嘉抒,有兩個必須實(shí)現(xiàn)的代理方法:
public func diffIdentifier() -> NSObjectProtocol { return self as NSObjectProtocol }
public func isEqual(toDiffableObject object: ListDiffable?) -> Bool { return true }
數(shù)據(jù)是否更新 便是由這兩個方法決定,如果數(shù)據(jù)更新了就可以進(jìn)而去觸發(fā)UI的刷新袍暴。
注意:如果是以整個model為單位來判斷是否更新些侍,在需要更新時,model必須要被賦值成一個新的model才能觸發(fā)UI更新政模。
比如:
let newModel = Model()
model = newModel
如果是以model中的屬性值變更來判斷是否更新岗宣,則代理方法需要相應(yīng)的寫成對屬性的對比判斷:
public func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
guard let object = object as? Model else { return false }
return (object.variable1 == variable1.oldValue)
&& (object.variable2 == variable2.oldValue)
}
// 需要更新時就可以通過model屬性的變更實(shí)現(xiàn)對UI的刷新了
model.variable1 = newValue....
IGListKit 刷新API
IGListKit有幾種方式刷新UI, 在數(shù)據(jù)model更新后,就可以調(diào)用刷新UI的方法去實(shí)現(xiàn)對UI刷新:
for adapter
// 刷新整個collectionView, 適用于section-level operations
1. performUpdates(animated: Bool, completion: )
// 刷新所有sections淋样,包括數(shù)據(jù)源的添加和刪除
2. reloadData(completion: )
// 刷新對應(yīng)sectionController里的所有cells
3. reloadObjects(models: [Model])
for sectionController context
// 在sectionController里刷新耗式,并且可以精確到某個cell的刷新
1. collectionContext.reload(_ sectionController: ListSectionController, animated: Bool = true)
`collectionContext.reload(self.cellForItem(at: 1), animated: true)`
SectionController協(xié)議方法
外層viewController可以對collectionView實(shí)現(xiàn)多種協(xié)議方法, 用于監(jiān)聽section的狀態(tài),比如:
1. willDisplay
2. didEndDisplaying
3. didScroll
4. willBeginDragging
...
sectionController 同樣支持這些協(xié)議趁猴,這樣刊咳,結(jié)合context.reload(self)
,原本需要寫在viewController里的許多實(shí)現(xiàn)都可以搬到sectionController里了儡司。