我正在考虑将我的应用程序从 Core Data 包装器迁移到 Realm,令人烦恼的一件事是 Realm 如何使用字符串作为其谓词,而不是推断查询中的类型。
例如,为什么我必须这样做:
Realm().objects(Dog).filter("age < 5").sorted("name")
而不是像这样的 Swift 方式:
Realm().objects(Dog).filter { $0.age < 5 }.sorted { $0.name }
我遗漏了一些东西,或者这真的是您使用 Realm for Swift 的方式吗?
最佳答案
使用 Swift 内置的集合过滤方法比使用 Realm 的 NSPredicate
效率低查询接口(interface)。
Swift 内置的集合过滤效率较低的一个关键原因是它需要为 Realm 中存储的每个对象分配一个 Swift 对象。这是必要的,因为 Swift 对象必须存在于内存中,以便 Swift 计算诸如 $0.age < 5
之类的表达式。 。使用NSPredicate
允许 Realm 将谓词转换为内部查询格式,可以直接根据 Realm 中存储的属性进行评估,而无需分配 Swift 模型类的实例。然后,当访问结果集中的对象时,可以延迟分配实例。
当 Realm 的查询执行引擎理解正在执行的查询的语义时,它还可以执行更多优化。例如,当使用索引属性时,索引可用于更有效地执行查询。如果谓词是一个 Swift 闭包,那么它的行为对于 Realm 来说是不透明的,从而阻止了这些优化。
值得指出的是NSPredicate
出于非常相似的原因,Core Data 也用于查询。
关于swift - 在 Realm Swift 中推断查询中的类型而不是字符串谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36108902/