我想知道Realm的查询性能。鉴于此代码:
let result1 = realm.objects(Person.self).filter("age < 30 AND ... AND ...")
let result2 = realm.objects(Person.self).filter({ $0.age < 30 }).filter({$0.name .... }).filter({$0.nickname ...})
result1
是使用Person
过滤NSPredicate
个对象创建的,而result2
是使用Swift集合类型中的filter
方法过滤的。
这两种过滤方法之间是否存在性能差异?
答案 0 :(得分:6)
是的,这两种方法之间存在性能差异。
基于NSPredicate
的过滤由Realm的查询引擎执行,该查询引擎直接过滤Realm文件中的数据,而无需创建Person
的实例。它可以利用数据库结构的知识来更有效地执行查询(例如,通过使用索引)。相反,基于块的过滤必须为您Realm中的每个对象创建Person
的实例,以便将它们传递给块。
还存在其他语义差异,这主要源于两种方法的不同结果类型。基于NSPredicate
的过滤返回Results<T>
而不是基于块的过滤返回的[T]
。
Results<T>
是对查询结果的实时更新视图。您可以将其中一个提供给视图控制器,并且在应用程序的其他部分执行写入操作后,其内容将更新,从而导致新对象开始匹配谓词。您还可以注册更改通知,以了解新对象何时开始匹配谓词,现有对象是否停止匹配,或者匹配的对象是否以某种方式进行了修改。