iOS-IGListKit学习

「这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

IGListKit 是一个数据驱动的UICollectionView框架,用于构建快速灵活的列表,可以有效避免了使用UICollectionView产生的大量试图控制器,降低耦合度,提高灵活性,在一定程度上可以降低后期维护成本。

通过这个框架,您可以提供一系列在UICollectionView中显示的对象。 对于每种类型的对象,适配器创建一个名为section controller的内容,该控件具有创建单元格的所有细节。

image.png

IGListKit会自动分辨对象,并在UICollectionView上执行动画批量更新以进行任何更改。 这样就不必自己编写批量更新,避免在这里列出的问题,从而可以更专注于数据逻辑的代码上。

IGListKit的刷新时机

既然说IGListKit是一个数据驱动的UICollectionView框架,那它的刷新当然就是由数据来决定的了。
当数据发生变化时,相应的sectionViewController就可以根据数据是否有变化作出刷新处理。

在IGListKit框架的Model中,有两个必须实现的代理方法:

public func diffIdentifier() -> NSObjectProtocol { return self as NSObjectProtocol }

public func isEqual(toDiffableObject object: ListDiffable?) -> Bool { return true }
复制代码

数据是否更新 便是由这两个方法决定,如果数据更新了就可以进而去触发UI的刷新。

注意:如果是以整个model为单位来判断是否更新,在需要更新时,model必须要被赋值成一个新的model才能触发UI更新。
比如:

let newModel = Model()
model = newModel
复制代码

如果是以model中的属性值变更来判断是否更新,则代理方法需要相应的写成对属性的对比判断:

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属性的变更实现对UI的刷新了
model.variable1 = newValue....
复制代码
IGListKit 刷新API

IGListKit有几种方式刷新UI, 在数据model更新后,就可以调用刷新UI的方法去实现对UI刷新:

for adapter
// 刷新整个collectionView, 适用于section-level operations
1. performUpdates(animated: Bool, completion: )

// 刷新所有sections,包括数据源的添加和删除
2. reloadData(completion: )

// 刷新对应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协议方法

外层viewController可以对collectionView实现多种协议方法, 用于监听section的状态,比如:

1. willDisplay
2. didEndDisplaying
3. didScroll
4. willBeginDragging
...
复制代码

sectionController 同样支持这些协议,这样,结合context.reload(self),原本需要写在viewController里的许多实现都可以搬到sectionController里了。

Guess you like

Origin juejin.im/post/7034905418715365390
ios