【问题标题】:Realm and Diffable Data Source领域和 Diffable 数据源
【发布时间】: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。

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

【问题讨论】:

    标签: ios swift


    【解决方案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 })
    

    【讨论】:

    • 您尚未提出问题或指定您需要什么帮助。提供更多信息以帮助其他人回答问题。
    • 我想回答上面的问题,我写的就是答案。这是另一种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2015-11-17
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多