我正在尝试使用iOS 13中内置的一些新的差异类以及Core。我遇到的问题是,controllerdidChangeContentWith不像预期的那样工作。它传递给我一个快照引用,它是对
NSDiffableDataSourceSnapshot<Section, NSManagedObjectID>这意味着我得到了已更改的部分/对象ID的列表。
这部分工作得很好。但是,当您到达集合视图中的差异时,问题就出现了。在WWDC的视频中,他们高兴地呼叫
dataSource.apply(snapshot, animatingDifferences: true)一切都是神奇的,但在实际的API中并非如此。
在我最初的尝试中,我尝试了这样的方法:
resolvedSnapshot.appendItems(snapshot.itemIdentifiersInSection(withIdentifier: section).map {
controller.managedObjectContext.object(with: $0 as! NSManagedObjectID) as! Activity
}, toSection: .all)这适用于填充单元格,但如果数据在单元格(IE )上发生了更改。(单元格标题)特定的单元格永远不会重新加载。我查看了快照,问题似乎只是我有对这些活动对象的引用,因此它们都同时更新(这意味着旧快照中的活动等同于新快照中的活动,因此散列是相等的)。
我的当前解决方案是使用一个包含所有活动类变量的结构,但它与CoreData断开了连接。所以我的数据源变成了:
var dataSource: UICollectionViewDiffableDataSource<Section, ActivityStruct>这样,快照实际上得到两个不同的值,因为它有两个不同的对象要比较。这是可行的,但它似乎远没有优雅,这是我们的目的是如何使用这个?还是现在只是处于破碎状态?WWDC的视频似乎暗示它不应该需要所有这些额外的样板。
发布于 2019-11-05 11:32:14
我遇到了同样的问题,我想我明白了什么是有效的:
有两个类:UICollectionViewDiffableDataSource和UICollectionViewDiffableDataSourceReference
据我所知,当您使用第一种方法时,您将所有权作为“真理之源”,因此您创建了一个充当数据源的对象。当您使用第二个数据源(数据源引用)时,您将“真理源”推迟到另一个数据源(在本例中为CoreData)。
您将实例化...DataSourceReference,实质上与...DataSource一样。
dataSourceReference = UICollectionViewDiffableDataSourceReference(collectionView: collectionView, cellProvider: { (collectionView, indexPath, object) -> UICollectionViewCell? in
let identifier = <#cell identifier#>
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath)
<#cell configuration#>
return cell
})然后,当您实现NSFetchedResultsControllerDelegate时,可以使用以下方法:
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeContentWith snapshot: NSDiffableDataSourceSnapshotReference)
{
dataSourceReference.applySnapshot(snapshot, animatingDifferences: true)
}我也看了WWDC的视频,没有看到这个参考。必须犯几个错误才能到达这里。我希望它对你有用!
https://stackoverflow.com/questions/58485982
复制相似问题