UI Data Source 改进——WWDC 2019

UI Data Source 改进

app数据源越来越复杂的大环境下,为了简化而退出数据源的改进,我们称之为差量数据源(DiffableDataSource)。

1、在iOS中,使用下面类实现差量数据源

UICollectionViewDiffableDataSource
UITableViewDiffableDataSource
NSDiffableDataSourceSnapshot

以前我们通过indexPath更新数据,现在我们通过section标志符和item标志符进行更新数据,只需调用apply方法。

UICollectionView差量数据源使用步骤

//1.创建数据源
var dataSource: UICollectionViewDiffableDataSource!

//使用注册器注册cell。MountainsController是一个类,Mountain是一个结构体。
let cellRegistration = UICollectionView.CellRegistration
 { (cell, indexPath, mountain) in
    // Populate the cell with our item description.
    cell.label.text = mountain.name
}

//  Section表示有多少组section,MountainsController.Mountain表示每组有多少个item
dataSource = UICollectionViewDiffableDataSource(collectionView: mountainsCollectionView) {
    (collectionView: UICollectionView, indexPath: IndexPath, identifier: MountainsController.Mountain) -> UICollectionViewCell? in
    // Return the cell.
    return collectionView.dequeueConfiguredReusableCell(using: cellRegistration, for: indexPath, item: identifier)
}


//2.创建快照
var snapshot = NSDiffableDataSourceSnapshot()
snapshot.appendSections([.main])
snapshot.appendItems(mountains)

//3.通过数据源调用apply方法更新UI
dataSource.apply(snapshot, animatingDifferences: true)

UITableView差量数据源使用步骤

//注意:和UICollectionView不一样,UITableView没有注册器,因此注册方式还是和以前一样
tableView.register(UITableViewCell.self, forCellReuseIdentifier: xxx)

//1、创建差量数据源
self.dataSource = UITableViewDiffableDataSource (tableView: tableView) {
  //在这里面返回cell
  let cell = tableView.dequeueReusableCell(withIdentifier: xxx, for: xxx)
  return cell
}

//2、创建快照并更新数据。注意:appendSections和appendItems是根据组数可以多次调用的
currentSnapshot = NSDiffableDataSourceSnapshot()
currentSnapshot.appendSections([.config])
currentSnapshot.appendItems(configItems, toSection: .config)
if controller.wifiEnabled {
    let sortedNetworks = controller.availableNetworks.sorted { $0.name < $1.name }
    let networkItems = sortedNetworks.map { Item(network: $0) }
    currentSnapshot.appendSections([.networks])
    currentSnapshot.appendItems(networkItems, toSection: .networks)
}
self.dataSource.apply(currentSnapshot, animatingDifferences: animated)

创建空快照

//Empty snapshot
let snapshot = NSDiffableDataSourceSnapshot()

拷贝当前数据源的快照

//Current data source snapshot copy
let snapshot = dataSource.snapshot()

2、关于差量数据源标志符,我们可以使用字符串,整数或者UUID

你可能感兴趣的:(UI Data Source 改进——WWDC 2019)