我想知道 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
是通过使用NSPredicate
过滤Person
对象来创建的,而result2
是使用 Swift 集合类型的filter
方法过滤的。
这两种筛选方法之间是否存在性能差异?
是的,这两种方法之间存在性能差异。
基于NSPredicate
的过滤是由 Realm 的查询引擎执行的,它直接对 Realm 文件中的数据进行过滤,而无需创建Person
实例。它可以利用数据库结构的知识来更有效地执行查询(例如,通过使用索引)。相反,基于块的过滤必须为 Realm 中的每个对象创建Person
实例,以便将它们传递给块。
还有其他语义差异,这主要源于两种方法的不同结果类型。基于NSPredicate
的筛选返回Results<T>
,而不是基于块的筛选返回的[T]
。
Results<T>
是查询结果的实时更新视图。您可以将一个交给视图控制器,其内容将在应用程序的其他部分执行写入后更新,从而导致新对象开始匹配谓词。您还可以注册更改通知,以了解新对象何时开始匹配谓词、现有对象何时停止匹配,或者何时以某种方式修改了匹配的对象。