IGListKit介绍简单使用

本文主要介绍IGListKit的Objective-C的用法,目前GitHub上的Demo和文档都是Swift版本的,介于我们开发语言是Objective-C所以我也查了网上相关的一些篇幅介绍IGListKit的使用但都已经是过时的版本了(Swift不是很熟练所以有部分Swift代码还不能顺利翻译为OC),特别说明的是熟练于OC和Swift开发的应该看着官方的Demo就能直接写出OC版本了,这里主要给懒人在这里啰嗦的,毕竟大家都很懒😂。。。。

简书地址
Demo下载

IGListKit的介绍

这是我从网上抄了一部分关于IGListKit的介绍
IGListKit 这个库是在 try! Swift NYC 这个会议上,这是由 Instagram 开发的应用在自身 App 上的一个 UI 组件库。基于UICollectionView的框架,使用数据驱动,旨在创造一个更快更灵活的列表控件。这个框架设计的非常好,完美符合高内聚、低耦合,意在替代UICollectionView,在我的使用中也确实体会到了它的优势。
IGListKit 并不是由 Swift 开发的一个库,它依然使用了 Objective-C 为主要语言开发。我想是因为 Instagram 作为已经五年以上的 App,也就是一定是一个 Objective-C 项目。它运作良好,没有特殊原因没必要用 Swift 重写。所以它的核心 UI 组件库 IGListKit 依然是 Objective-C 也是正常的。

IGListKit 优势

  • 不要再调用 performBatchUpdates(_:, completion:) 或者 reloadData() 。
  • 具有可重用的单元和组件的更好的体系结构
  • 创建具有多个数据类型的集合
  • 解耦的差异算法
  • 充分的单元测试
  • 为你的模块自定义你的差异行为
  • 可扩展的API
  • 使用Objective-C编写,具有全Swift互操作支持

IGListKit应用

使用IGListKit后UICollectionView的协议UICollectionDataSource和UICollectionViewDelegate不用再使用,取而代之的是SectionController来实现对应的方法,由IGListAdapter把UICollectionView绑定在一起。

IGListAdapter的初始化
1
2
3
4
5
6
7
8
9
10
11
self.collectionView=[[UICollectionView alloc]initWithFrame:CGRectZero collectionViewLayout:[[UICollectionViewFlowLayout alloc]init]];
self.collectionView.backgroundColor=[UIColor whiteColor];
IGListAdapterUpdater*updater=[[IGListAdapterUpdater alloc]init];
_adapter=[[IGListAdapter alloc]initWithUpdater:updater viewController:self workingRangeSize:0];
_adapter.collectionView=self.collectionView;
_adapter.dataSource=self;
[self.view addSubview:self.collectionView];
IGListAdapter的协议
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (nullable UIView *)emptyViewForListAdapter:(nonnull IGListAdapter *)listAdapter {
//没有数据时候的View
UILabel *label=[UILabel new];
label.text=@"没有数据";
label.textAlignment=NSTextAlignmentCenter;
return label;
}
- (nonnull IGListSectionController *)listAdapter:(nonnull IGListAdapter *)listAdapter sectionControllerForObject:(nonnull id)object {
DemoSectionController *section=[[DemoSectionController alloc]init];
return section;
}
- (nonnull NSArray<id<IGListDiffable>> *)objectsForListAdapter:(nonnull IGListAdapter *)listAdapter {
//数据源
return self.dataArray;
}
IGListSectionController的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
- (NSInteger)numberOfItems{
//每个section返回多少行根据数据来写 一般可能就是1
return 3;
}
- (CGSize)sizeForItemAtIndex:(NSInteger)index{
return CGSizeMake(self.collectionContext.containerSize.width, 46);
}
-(UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index{
DemoCollectionViewCell*cell=[self.collectionContext dequeueReusableCellOfClass:[DemoCollectionViewCell class] forSectionController:self atIndex:index];
[cell setModel:_object row:index];
return cell;
}
- (void)didSelectItemAtIndex:(NSInteger)index {
NSLog(@"点击Section%ld row%ld",(long)self.section,(long)index);
}
- (void)didUpdateToObject:(id)object{
//数据传输到这里
_object =(DemoModel *)object;
}
IGListKit结构

IGListDiffable and Equality

IGListDiffable使用的是Paul Heckel 的A technique for isolating differences between files 的算法,简单来说这个算法就是计算collectionView前后数据变化增删改移关系的一个算法,算是IGListKit的特色特点之一 。

实现差异比较需要自定义model遵守IGListDiffable协议并实现

1
2
3
4
5
6
7
8
9
10
11
12
13
- (nonnull id<NSObject>)diffIdentifier {
return self;
}
- (BOOL)isEqualToDiffableObject:(nullable id<IGListDiffable>)object {
if (self == object) {
return YES;
} else if (self == nil || object == nil) {
return NO;
}
return YES;
}