地址:https://github.com/Instagram/IGListKit
Instagram在2016年年底发布了基于数据驱动的UICollectionView框架IGListKit。使用数据驱动去创造更为快速灵活的列表控件。以下是该框架的特点:
image.png
- 数据驱动(数据改变 -> Diff算法 -> update界面)
- 可重复单元和组件的更好体系结构
- 解耦的差异算法
- 可以为数据模型自定义差异算法
- 可扩展的API
整个框架通过
Adapter
将过去直接暴露的 CollectionView Datasource 和 Delegate 实现进行包装,并通过它关联 Model 和 IGListSectionController。这使得上层用户只需要继承并实现所需要的 IGListSectionController 接口即可,很好地进行了代码解耦。
- 能够将一个负责的Cell拆分成多个简单的cell进行组合,对于项目后期扩展有非常大的意义;
- 能够将同一列表不同模块很好的隔离。比如业务数据中插入广告数据
IGListAdapter
IGListAdapterDataSource
IGListAdapterDelegate
IGListAdapter的三个参数:
- IGListAdapterUpdater : 是一个实现了IGListUpdatingDelegate协议的对象,负责处理row和section的刷新。
- Controller : Adapter和Controller互相持有的同时,也负责管理着SectionController。
- WorkingRange : 可以为不可见范围的section准备内容。
self.adapter = [[IGListAdapter alloc] initWithUpdater:[[IGListAdapterUpdater alloc] init] viewController:self];
self.adapter.dataSource = self;
self.adapter.collectionView = self.collectionView;
实现Adapter的datasource协议
@protocol IGListAdapterDataSource <NSObject>
- (NSArray<id <IGListDiffable>> *)objectsForListAdapter:(IGListAdapter *)listAdapter;
- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object;
- (nullable UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter;
@end
IGListSectionController
子类
IGListSingleSectionController
IGListStackSectionController
IGListBindingSectionController
在原来的UICollectionViewController里的写法,我们一定都会实现UICollectionDataSource和UICollectionViewDelegate。
不过在IGListKit中,不用在ViewController中实现相关协议,取而代之的是SectionController来实现对应的方法
子类必须实现以下三个方法
- (NSInteger)numberOfItems;
- (CGSize)sizeForItemAtIndex:(NSInteger)index;
- (__kindof UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index;
IGListDiffable
ListDiffable协议,这属于IGListKit核心Diff算法的一部分,实现了ListDiffable协议才能使用diff算法,这个算法是计算新老两个数组前后数据变化增删改移关系的一个算法,时间复杂度是O(n),算是IGListKit的特色特点之一。使用的是Paul Heckel 的A technique for isolating differences between files 的算法。
案例
IGListKitDemoOC:好的demo
SilkyWXList:高仿朋友圈
网友评论