×
广告

IGListKit简单介绍和使用第一篇

96
ws1227
2018.07.13 16:54* 字数 700

本文主要介绍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的初始化
 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的协议
- (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的方法
- (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结构
image

IGListDiffable and Equality

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

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

- (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;
}

其他的用法在以后文章慢慢写吧今天就到此为止吧。

打个小广告我们的App托管平台51zan.cc价格便宜速度快稳定可靠无须实名认证来围观下吧

日记本
Web note ad 1