DiffableDataSources
💾 为 backporting UITableView/UICollectionViewDiffableDataSource 提供的库
由DifferenceKit 驱动。
用
介绍
苹果在 2019 年的 WWDC 上宣布了一种新的可区分的数据源。
这是一个优秀的 API,它可以很容易地通过自动差异更新我们的表格视图和收集视图项。
然而,我们需要一段时间才能在产品服务中使用它。
那是因为它需要最新的操作系统才能使用。
DiffableDataSources 使我们现在就可以引入几乎相同的功能。
使用开源的 DifferenceKit 作为算法引擎。
它非常快,并且完全避免了同步错误、异常和崩溃。
与官方的差异
规范
- 支持 iOS 9.0+ / macOS 10.11+ / tvOS 9.0+
- 开源算法。
- 允许重复的节或项目。
- 使用
performBatchUpdates
进行差异更新。
命名
使用DiffableDataSources
的不同类名以避免与官方API冲突。
对应表如下。
官方 | 向后移植 |
---|---|
NSDiffableDataSourceSnapshot | DiffableDataSourceSnapshot |
UITableViewDiffableDataSource | TableViewDiffableDataSource |
UICollectionViewDiffableDataSource | CollectionViewDiffableDataSource |
NSCollectionViewDiffableDataSource | CocoaCollectionViewDiffableDataSource |
入门指南
构建项目
$ git clone https://github.com/ra1028/DiffableDataSources.git
$ cd DiffableDataSources/
$ make setup
$ open DiffableDataSources.xcworkspace
基本用法
首先,定义表示部分的类型。
它应该符合Hashable
来在所有部分中标识。
枚举类型可以方便地使用,因为它们默认符合Hashable
。
enum Section {
case main
}
然后,定义符合Hashable
的项类型。
struct User: Hashable {
var name: String
}
创建一个数据源对象,它将自动设置为表格视图。
您应通过闭包获取非nil的单元格。
final class UsersViewController: UIViewController {
let tableView: UITableView = ...
lazy var dataSource = TableViewDiffableDataSource<Section, User>(tableView: tableView) { tableView, indexPath, user in
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = user.name
return cell
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
}
}
通过中介DiffableDataSourceSnapshot
直观地管理和更新数据源。
直到您应用编辑后的快照对象,UI不会更新。
通过应用编辑后的快照自动计算差异动画以更新UI。
let users = [
User(name: "Steve Jobs"),
User(name: "Stephen Wozniak"),
User(name: "Tim Cook"),
User(name: "Jonathan Ive")
]
let snapshot = DiffableDataSourceSnapshot<Section, User>()
snapshot.appendSections([.main])
snapshot.appendItems(users)
dataSource.apply(snapshot) {
// completion
}
查阅文档以获取更详细的API信息。
[查看更多用法]
需求
- Swift 5.0+
- iOS 9.0+
- macOS 10.11+
- tvOS 9.0+
安装
CocoaPods
在您的 Podfile
中添加以下内容
pod 'DiffableDataSources'
Carthage
在您的 Cartfile
中添加以下内容
github "ra1028/DiffableDataSources"
Swift Package Manager
在您的 Package.swift
依赖项中添加以下内容
.package(url: "https://github.com/ra1028/DiffableDataSources.git", from: "x.x.x")
贡献
欢迎提交拉取请求、错误报告和特性请求
有关如何为 DiffableDataSources 贡献的更多信息,请参阅 CONTRIBUTING 文件。
关系
DifferenceKit
Swift集合中的一款快速灵活的O(n)差分算法框架。
Carbon
用于在UITableView和UICollectionView中构建基于组件的用户界面的声明式库。
许可
DiffableDataSources是在Apache 2.0许可证下发布的。