领域和 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 数据源子类之间共享数据模型的好方法是啥?
iOS 13 上 TableView 错误的 Diffable 数据源:移动的关联不一致