首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSFetchedResultsController + UICollectionViewDiffableDataSource + CoreData -如何区分整个对象?

NSFetchedResultsController + UICollectionViewDiffableDataSource + CoreData -如何区分整个对象?
EN

Stack Overflow用户
提问于 2019-10-21 12:07:21
回答 1查看 695关注 0票数 5

我正在尝试使用iOS 13中内置的一些新的差异类以及Core。我遇到的问题是,controllerdidChangeContentWith不像预期的那样工作。它传递给我一个快照引用,它是对

代码语言:javascript
复制
NSDiffableDataSourceSnapshot<Section, NSManagedObjectID>

这意味着我得到了已更改的部分/对象ID的列表。

这部分工作得很好。但是,当您到达集合视图中的差异时,问题就出现了。在WWDC的视频中,他们高兴地呼叫

代码语言:javascript
复制
dataSource.apply(snapshot, animatingDifferences: true)

一切都是神奇的,但在实际的API中并非如此。

在我最初的尝试中,我尝试了这样的方法:

代码语言:javascript
复制
resolvedSnapshot.appendItems(snapshot.itemIdentifiersInSection(withIdentifier: section).map {
     controller.managedObjectContext.object(with: $0 as! NSManagedObjectID) as! Activity
}, toSection: .all)

这适用于填充单元格,但如果数据在单元格(IE )上发生了更改。(单元格标题)特定的单元格永远不会重新加载。我查看了快照,问题似乎只是我有对这些活动对象的引用,因此它们都同时更新(这意味着旧快照中的活动等同于新快照中的活动,因此散列是相等的)。

我的当前解决方案是使用一个包含所有活动类变量的结构,但它与CoreData断开了连接。所以我的数据源变成了:

代码语言:javascript
复制
var dataSource: UICollectionViewDiffableDataSource<Section, ActivityStruct>

这样,快照实际上得到两个不同的值,因为它有两个不同的对象要比较。这是可行的,但它似乎远没有优雅,这是我们的目的是如何使用这个?还是现在只是处于破碎状态?WWDC的视频似乎暗示它不应该需要所有这些额外的样板。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-05 11:32:14

我遇到了同样的问题,我想我明白了什么是有效的:

有两个类:UICollectionViewDiffableDataSourceUICollectionViewDiffableDataSourceReference

据我所知,当您使用第一种方法时,您将所有权作为“真理之源”,因此您创建了一个充当数据源的对象。当您使用第二个数据源(数据源引用)时,您将“真理源”推迟到另一个数据源(在本例中为CoreData)。

您将实例化...DataSourceReference,实质上与...DataSource一样。

代码语言:javascript
复制
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时,可以使用以下方法:

代码语言:javascript
复制
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeContentWith snapshot: NSDiffableDataSourceSnapshotReference)
{
    dataSourceReference.applySnapshot(snapshot, animatingDifferences: true)
}

我也看了WWDC的视频,没有看到这个参考。必须犯几个错误才能到达这里。我希望它对你有用!

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58485982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档