swift - 使用 NSPredicate 和 block 过滤 Realm 的区别

标签 swift 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 使用 过滤>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/

相关文章:

swift - 使用 Kingfisher,图像无法在 UITableView 中正确加载

ios - Swift:谷歌翻译格式失败

ios - 当我点击并按住特定 View 时如何使其他 Collection View 变暗或模糊?

ios - UITextView 字体反转回系统默认

react-native - 如何用数据预填充 Realm 数据库?

ios - Realm iOS 的模糊安装说明

ios - 具有多个数据模型的多个 Realm

swift - 如何在 swift 代码中的 Ui TextView 中上传 RTF 文件

ios swift 使用 Realm 数据库建模结构

json - 在 Docker Windows 上的 Keycloak 中添加 Realm 时出现意外的服务器错误