使用 NSPredicate 和 block 过滤 Realm 之间的区别



我想知道 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>是查询结果的实时更新视图。您可以将一个交给视图控制器,其内容将在应用程序的其他部分执行写入后更新,从而导致新对象开始匹配谓词。您还可以注册更改通知,以了解新对象何时开始匹配谓词、现有对象何时停止匹配,或者何时以某种方式修改了匹配的对象。

最新更新