写在前面
IGListKit 是一个数据驱动的UICollectionView框架,用于构建快速灵活的列表,可以有效避免了使用UICollectionView产生的大量试图控制器,降低耦合度,提高灵活性,在一定程度上可以降低后期维护成本。
通过这个框架,您可以提供一系列在UICollectionView中显示的对象。 对于每种类型的对象,适配器创建一个名为section controller的内容,该控件具有创建单元格的所有细节。
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里了。