NSPredicate 过滤 Realm 和 block 的区别

2024-04-13

我想知道 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, while result2正在使用过滤filterSwift 集合类型中的方法。

这两种过滤方法之间有性能差异吗?


是的,两种方法之间存在性能差异。

The NSPredicate基于 的过滤由 Realm 的查询引擎执行,它直接过滤 Realm 文件中的数据,而无需创建实例Person。它可以利用数据库结构的知识来更有效地执行查询(例如,通过使用索引)。相反,基于块的过滤必须创建Person对于领域中的每个对象,以便将它们传递到块。

还有其他语义差异,这主要源于两种方法的不同结果类型。这NSPredicate基于过滤返回Results<T>而不是[T]基于块的过滤返回的结果。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSPredicate 过滤 Realm 和 block 的区别 的相关文章

随机推荐