我想知道 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
使用 过滤>filter
方法来自 Swift 的集合类型。
这两种过滤方法之间是否存在性能差异?
最佳答案
是的,这两种方法之间存在性能差异。
NSPredicate
-based 过滤由 Realm 的查询引擎执行,它直接过滤 Realm 文件中的数据,而无需创建 Person
的实例。 .它可以利用数据库结构的知识来更有效地执行查询(例如,通过使用索引)。相反,基于 block 的过滤必须创建 Person
的实例。对于您 Realm 中的每个对象,以便将它们传递给 block 。
还有其他语义差异,这主要源于两种方法的不同结果类型。 NSPredicate
基于过滤返回 Results<T>
而不是 [T]
基于 block 的过滤返回。
Results<T>
是查询结果的实时更新 View 。您可以将一个交给 View Controller ,它的内容将在应用程序的其他部分执行导致新对象开始匹配谓词的写入操作后更新。您还可以注册更改通知以了解新对象何时开始匹配谓词、现有对象何时停止匹配它,或者匹配的对象何时以某种方式被修改。
关于swift - 使用 NSPredicate 和 block 过滤 Realm 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43271459/