13. 更新collection视图中的数据
Mountains Search示例演示了当用户筛选数据时,如何在collection视图中更新数据和用户界面。它显示了山脉名称的列表,并允许用户在搜索栏中键入文本,以便根据山脉名称进行过滤。
这个集合视图mountainsCollectionView包含一个单独的section,其中包含从每个山的原始数据列表中创建的item。本例将数据的每一部分封装在MountainsController中定义的Mountain结构中。为了管理数据,本例使用一个可扩散的数据源,该数据源包含单个section和类型为Mountain的item。创建可扩散数据源(diffable data source)时,它将连接到mountainsCollectionView并注册一个单元类型LabelCell,以在collection视图中显示山的名称。然后,它用山的名字来配置这个单元。
performQuery(with:) 方法更新数据和用户界面。该方法接受当前键入的筛选器文本,并生成名称中包含该文本的山脉列表。然后,它使用快照构造新过滤数据的表示。快照包含与以前相同的单个部分,但是现在,它不再包含表示每个山的项,而是只包含过滤后的山。
然后,该方法调用apply(_:animatingDifferences:completion:),将快照中的数据应用于可扩散数据源。diffable数据源将快照中的数据存储为数据的新状态,计算上一个状态和新状态之间的差异,并触发用户界面以显示新状态。
func performQuery(with filter: String?) {
let mountains = mountainsController.filteredMountains(with: filter).sorted { $0.name < $1.name }
var snapshot = NSDiffableDataSourceSnapshot<Section, MountainsController.Mountain>()
snapshot.appendSections([.main])
snapshot.appendItems(mountains)
dataSource.apply(snapshot, animatingDifferences: true)
}
更新数据
14. 更新多个section中的数据
Settings:Wi-Fi示例演示了如何在使用多种section和item的table view中更新数据和用户界面。它在iOS设置中重新创建Wi-Fi页面,允许用户打开和关闭Wi-Fi开关以查看可用的和当前的Wi-Fi网络。
updateUI(animated:) 方法根据是否启用Wi-Fi来确定要显示的section和item。如果禁用Wi-Fi,则该方法仅将.config section及其item添加到快照中。如果启用了Wi-Fi,则该方法会添加.networks部分及其item。
let configItems = configurationItems.filter { !($0.type == .currentNetwork && !controller.wifiEnabled) }
currentSnapshot = NSDiffableDataSourceSnapshot<Section, Item>()
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)
更新多个section中的数据
15. 增量更新数据
插入排序可视化示例演示了如何增量更新数据,在数据从初始状态更改为最终状态时显示可见的进度。它以随机顺序显示一行色样,然后按光谱顺序迭代排序。
此示例与其他可扩散数据源示例之间的关键区别在于,此示例不会创建空快照来更新数据的状态。相反,performSortStep() 方法通过使用数据源.snapshot(). 然后,它只修改快照的一部分,以逐步执行可视化排序。
// Get the current state of the UI from the data source.
var updatedSnapshot = dataSource.snapshot()
// For each section, if needed, step through and perform the next sorting step.
updatedSnapshot.sectionIdentifiers.forEach {
let section = $0
if !section.isSorted {
// Step the sort algorithm.
section.sortNext()
let items = section.values
// Replace the items for this section with the newly sorted items.
updatedSnapshot.deleteItems(items)
updatedSnapshot.appendItems(items, toSection: section)
sectionCountNeedingSort += 1
}
}
增量更新数据
网友评论