您的位置:首页 > 产品设计 > UI/UE

Instagram/IGListKit 实践谈(UICollectionView框架)

2016-12-26 08:46 357 查看
简单介绍

IGListKit是Instagram推出的新的UICollectionView框架,使用数据驱动,旨在创造一个更快更灵活的列表控件。

github地址:https://github.com/Instagram/IGListKit

这个全新的控件一出来,我就赶快投入实践了一把。

先谈一谈我对这个控件的结论:这个框架设计的非常好,完美符合高内聚、低耦合。IGListKit 是一个很典型的使用 Objective-C 开发的,但却是个偏向使用 Swift 语言开发者的一个 UI 组件库。

使用过程也面临了一些疑惑,先谈一下使用收获:

它的优势在于flexible,比起原来的UICollectionView,在使用上更加灵活,在数据驱动上做的更好。

这个框架在fast上体现的还不够,但不妨碍我们自己进行下一步优化。

先看看IGListKit的结构

[b]

let oldModel = [
Num(id: 1, name: "1"),
Num(id: 2, name: "2"),
Num(id: 3, name: "4"),
Num(id: 4, name: "1"),
]
let newModel = [
Num(id: 1, name: "1"),
Num(id: 2, name: "2"),
Num(id: 3, name: "3"),
Num(id: 4, name: "5"),
]
let result = IGListDiffPaths(0, 0, from, to, .equality).forBatchUpdates()
tableView.beginUpdates()
tableView.deleteRows(at: result.deletes, with: .fade)
tableView.insertRows(at: result.inserts, with: .fade)
for move in result.moves {
tableView.moveRow(at: move.from, to: move.to)
}
tableView.endUpdates()


View Code
首先oldIndexs是一个栈的结构,过程是先遍历新数组,将数组里模型的id对应的hash值作为key,找到对应的Num成员对象(实际代码中为entry,可以理解为一种抽象)的oldIndexs栈存入NSNotFound。

再遍历旧数组,拿例子来说,就是将数组里模型的id 对应的hash值作为key,找到对应的Num成员对象里的oldIndexs栈增加旧数组的下标值。

如果是新增加的,那么在hashtable中key对应的value存入的Num成员对象就是notfound。

这样算法如图使用的数据结构(已简化,实际稍复杂些),可以绑定新旧数组的成员的对应关系,包括成员间的移动增加删除修改关系,对于像TableView或者CollectionView非常适合不过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: