以懒惰的方式将 Realm 对象转换为非第三方对象:Results<Item> 到 [Item]

Convert Realm objects to non-third-party objects in a lazy way: Results<Item> to [Item]

提问人:Lory Huz 提问时间:10/11/2023 最后编辑:Lory Huz 更新时间:10/12/2023 访问量:39

问:

我正在尝试将 Realm 持久化对象映射到另一种类型以分离关注点

我有一个类似协议存储库的东西,用于检索一系列项目:[Item]

我有一个使用 Realm 实现这个存储库,所以我正在尝试将一个Results<PersistedItem>[Item]

Results<PersistedItem>当你直接在视图中使用它时,默认情况下是懒惰的,但随后你的整个应用程序都依赖于 Realm,因为你需要在每个视图中导入 Realm。

我已经尝试了这个 LazyList 实现,但每个项目都同时返回:

func items() -> LazyList<Item> {
    let dbItems = realm.objects(PersistedItem.self) // return List<PersistedItem>
    
    return LazyList(count: dbItems.count, useCache: true) { index in
        print(index) // this is printing every index
        return Item(persistedItem: dbItems[index])
    }
}

然后我只需在 iOS SwiftUI 列表中访问这个 LazyList。这适用于默认的 Realm 集合,但不适用于此 LazyList 实现。

struct TestLazyView: View {
    
    // Working
    //let items: Results<PersistedItems>
    
    // Not Working as it's load every items at init
    let items: LazyList<Items>
    
    var body: some View {
        List(items) { item in
            Text(item.id)
        }
    }
}

按需转换这些项目的方法是什么?谢谢!

swift realm 延迟初始化

评论

0赞 Jay 10/12/2023
这个问题需要澄清;“不工作”并没有真正为我们提供具体不起作用的背景。它会崩溃吗?预期结果是什么?一个大问题;你为什么要这样做?Realm 对象已经延迟加载了,所以...制作懒惰对象的目的是什么......懒惰?另外,整个应用都依赖于 Realm - 没错,这就是为什么你的应用是由 Realm 支持的。为什么不自始至终使用它呢?是有什么东西阻止了它的使用吗?你可以编写很多额外的代码来绕过 Realm,但为什么不直接使用它的内置功能呢?更易于维护,代码更少。
0赞 Lory Huz 10/12/2023
当您将关注点分开时,应用程序更易于维护。如果要将数据库从领域切换到另一个领域怎么办?在我的情况下,您需要更新每个代码视图,而我们只需要切换存储库。在我的示例中写了什么不起作用: // 这是打印每个索引
0赞 Jay 10/13/2023
当您将关注点分开时,应用程序更容易维护 - 同意但是......虽然本质在纸面上听起来不错,但实际实施往往是一场噩梦。特别是当您的分离包含用于覆盖数据库默认性质的代码时。在许多情况下,您最终会重构和重新思考整个结构。尝试从像 Firebase 这样的数据库迁移到 Realm,你会看到 - 完全不同的方法,重新思考一切。我们仍然不知道什么不起作用;打印每个索引正是该代码的作用。你期待一些不同的东西吗?
0赞 Lory Huz 10/13/2023
Firebase 用于 MVP 或原型设计,您很少会迁移 Realm DB for Firebase。我之所以使用 realm,是因为实体一开始实现起来更快,但如果它不能适应干净的架构,我可能会考虑切换到核心数据。代码正在打印视图中的所有索引,而我希望只打印访问的元素,因为默认情况下 List 是惰性的。
0赞 Jay 10/13/2023
我以 Firebase 为例,但仅供参考,它不是用于原型设计,它是可用于 MVP 的众多工具之一,但这不是它的目的。关键是选择数据库是因为它提供的功能和特性。覆盖这些功能或更改数据库(可以)会更改整体设计。例如,Realm 是一个多用户离线优先数据库。Core Data 根本不是一个多用户数据库,因此该功能已消失。你的代码会访问 Realm 中的所有元素对象,这就是它打印所有索引的原因。realm.objects(PersistedItem.self)

答: 暂无答案