DiffableDataSources 0.5.0

DiffableDataSources 0.5.0

ra1028 维护。



 
依赖于
DifferenceKit/UIKitExtension~> 1.1
DifferenceKit/AppKitExtension~> 1.1
 

  • ra1028

DiffableDataSources

💾为 backporting UITableView/UICollectionViewDiffableDataSource 提供的库
DifferenceKit 驱动。

Swift5 Release CocoaPods Carthage Swift Package Manager
Build Status Platform Lincense

❤️Ryo Aoyama 制作


介绍

苹果在 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许可证下发布的。