【问题标题】:Differences between filtering Realm with NSPredicate and block使用 NSPredicate 和 block 过滤 Realm 的区别
【发布时间】:2017-04-07 06:49:19
【问题描述】:

我想知道 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 方法进行过滤。

这两种过滤方法之间是否存在性能差异?

【问题讨论】:

    标签: swift realm


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多