领域和 Diffable 数据源

Posted

技术标签:

【中文标题】领域和 Diffable 数据源【英文标题】:Realm and Diffable Data Source 【发布时间】:2020-09-29 13:56:15 【问题描述】:

有没有人尝试将 Realm 与 diffable 数据源结合使用?似乎有一个我无法理解的问题。

因此,当我们使用“传统”数据源 API 时,在 cellForRowAt 中,我们基于 基于索引 获取特定行的对象,并且由于 Realm返回符合 Collection 的通用 Results 类型(例如let items = Results<Item>)内的对象,我们基本上可以像往常一样访问元素:items[indexPath.row]

但是,当您使用 diffable 数据源 并创建 快照 时,您会得到这样的结果:var snapshot = NSDiffableDataSourceSnapshot<Int, Item>。您通过执行snapshot.appendSections([0]) 添加一个部分,然后您必须将项目添加到该部分。 我的主要问题是你不能做snapshot.appendItems(items),因为items 的类型是Results<Item>,而不是Array<Item>。我在这里遗漏了什么吗?

此外,Realm 的 Object 类似乎有自己的 Hashable 实现,所以我认为除了覆盖 Realm 的 primaryKey 并实现自己的自动增量功能之外,没有办法确保对象的唯一性。这一切对我来说似乎有点奇怪,以至于我正在考虑切换到 Core Data。

没有在 *** 上找到类似的主题,因此我们将不胜感激。

【问题讨论】:

【参考方案1】:

您可以使用扩展名将Result<Items> 转换为Array

extension Results 
  func toArray() -> [Element] 
    return compactMap 
        $0
    
  

您可以像这样使用它:results.toArray(),它会为您提供数组,然后根据您的情况,您可以将 append 数据放入其中。

【讨论】:

Realm 数据库延迟执行查询,直到您访问结果,因此一旦您将结果转换为数组,它就会执行查询。如果您有一个包含数千个结果的查询,这将影响性能。理想情况下,您会将查询传递给数据源,让单元格/表格视图只查询它需要的单元格,而不是全部查询。【参考方案2】:

另外,你可以简单地使用这个方法:

let realmArray = Array(items!)

【讨论】:

谢谢你,罗姆人!【参考方案3】:

尝试使用 map() 转换数组

items = realm.objects(Item.self).map( $0 )

【讨论】:

您尚未提出问题或指定您需要什么帮助。提供更多信息以帮助其他人回答问题。 我想回答上面的问题,我写的就是答案。这是另一种方法。

以上是关于领域和 Diffable 数据源的主要内容,如果未能解决你的问题,请参考以下文章

diffable 数据源节标题在更新期间闪烁

UITableView diffable 数据源

在表/集合视图控制器及其关联的 diffable 数据源子类之间共享数据模型的好方法是啥?

iOS 13 上 TableView 错误的 Diffable 数据源:移动的关联不一致

如何使用 diffable UITableView 更新表格单元格

具有多个单元格的 Collectionview 和 diffable 部分