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

时间:2016-03-20 00:26:50

标签: swift realm

我考虑从我的核心数据包装器移植到我的应用程序的Realm,并且有一件事就是Realm如何使用字符串作为谓词,而不是在查询中推断出类型。

例如,为什么我必须这样做:

Realm().objects(Dog).filter("age < 5").sorted("name")

而不是像这样的Swift方式:

Realm().objects(Dog).filter { $0.age < 5 }.sorted { $0.name }

我遗漏了一些东西,或者这真的是你如何使用Realm for Swift?

1 个答案:

答案 0 :(得分:3)

使用Swift的内置集合过滤方法效率低于使用Realm的NSPredicate接口进行查询。

Swift的内置集合过滤效率较低的一个关键原因是它需要为存储在Realm中的每个对象分配一个Swift对象。这是必要的,因为Swift对象必须存在于内存中,以便Swift评估诸如$0.age < 5之类的表达式。使用NSPredicate允许Realm将谓词转换为内部查询格式,可以直接针对存储在Realm中的属性进行评估,而无需分配Swift模型类的实例。然后,当访问结果集中的对象时,可以懒惰地分配实例。

Realm的查询执行引擎在理解正在执行的查询的语义时也可以执行更多优化。例如,索引可用于在使用索引属性时更有效地执行查询。如果谓词是一个Swift闭包,它的行为对Realm是不透明的,阻止了这些优化。

值得指出的是,NSPredicate也被Core Data用于查询,原因非常相似。