swift - 在 Realm Swift 中推断查询中的类型而不是字符串谓词?

标签 swift realm

我正在考虑将我的应用程序从 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/

相关文章:

swift - NSString 扩展方法不调用 String 扩展方法

swift - RealmSwift 替代 RLMobject

swift - Realm - 将子级添加到父级,然后在父级上查询结果

ios - 将使用核心数据的 iOS 应用程序同步到云

ios - 当我在应用程序中按创建帐户时,它会在没有任何信息的情况下创建帐户

iOS:从网络下载超大数据的策略

ios - RealmSwiftObject 不受 Realm 管理。获取带有返回类的对象

ios - 数组到集合的转换需要 20 秒 - Swift 3

android - 从 Realm 数据库中获取单个列(Android)

ios - 从 Realm 对象的主键获取单个对象