应用NSDiffableDataSourceSnapshot破裂了吗?



我有一个问题,将NSDiffableDataSourceSnapshot应用到UICollectionViewDiffableDataSource。想象一下这种情况:我有两个项目,我想删除第二个项目,并且我想重新加载该部分中的所有其他项目。

我是这样做的:

var snapshot = oldSnapshot
if let item = getterForItemToDelete() {
snapshot.deleteItems([item])
}
snapshot.reloadItems(otherItems)

但是然后在数据源应用程序的单元格提供程序崩溃,因为它试图获得单元格的项目标识符,我不再有数据,所以我必须返回nil:

let dataSource = MyDataSource(collectionView: collectionView) { [weak self] collectionView, indexPath, identifier in
guard let viewModel = self?.viewModel.item(for: identifier) else { return nil }
...
}

奇怪的是,当我尝试调试它并在应用快照时打印我的项目时,它打印了一个项目:

(lldb) print snapshot.itemIdentifiers(inSection: .mySection)
([App.MyItemIdentifier]) $R0 = 1 value {
[0] = item (item = "id")
}

但是紧接着,在单元格提供程序中我得到了两个项目,我没有

(lldb) print self?.dataSource.snapshot().itemIdentifiers(inSection: .mySection)
([App.MyItemIdentifier]) $R1 = 2 values {
[0] = item (item = "ckufpa58100041ps6gmiu5zl6")
[1] = item (item = "ckufpa58100051ps69yrgaspv")
}

更奇怪的是,当我有3个项目,我想删除一个并重新加载其他项目时,这种情况不会发生。

解决我的问题的一个解决方法是在单元格提供程序中返回空单元格而不是nil:

let dataSource = MyDataSource(collectionView: collectionView) { [weak self] collectionView, indexPath, identifier in
guard let viewModel = self?.viewModel.item(for: identifier) else { 
return collectionView.dequeueReusableCell(withReuseIdentifier: "UICollectionViewCell", for: indexPath)
}
...
}

最后一个奇怪的事情,当我这样做,然后我看视图层次调试器,只有一个单元格,所以似乎空单元格被删除。

有谁知道我可能做错了什么,或者这只是预期的行为?因为我没有发现任何提及提供某种优化,动画或文档中的东西的单元格。

您不应该从快照中删除项。将它们从数组中移除。创建数据源的更新数组,调用这个新创建的数据源的快照。CollectionView将使用新数据自动更新。更简单地说,更改数组,然后再次applysapshot()。

相关内容

  • 没有找到相关文章

最新更新