NSFetchRequest简单地过滤关系?

时间:2012-06-19 07:13:31

标签: ios core-data

假设NSManagedObject A和一个B。现在AB之间存在多个bs关系。 使用[A.bs filter...] NSPredicate NSFetchRequest是非常方便的,但在B上使用相同的谓词和匹配关系的条件构建lastObject的速度可能会慢一些,或者我是误?

我猜这个性能问题更糟糕,如果你对结果做NSFetchRequest之类的事情只能得到一个结果。 (fetchLimit提供了NSFetchRequest属性,可以用于此目的。)

在类似的说明中,如果您只对一两个属性感兴趣,propertiesToFetch也会提供NSManagedObjects属性。

我的理由是,直接使用关系需要核心数据将所有NSManagedObjectContext提取到相关的NSFetchRequest。虽然NSFetchRequest可以在商店级别执行优化。

现在:

  • 我的推理是正确的吗?因此,如果您对 所有 关系对象不感兴趣,请使用{{1}}?
  • 是否有通过具有类似性能的关系获得方便(且明显更易读)的方法?

2 个答案:

答案 0 :(得分:0)

是的,您的假设是正确的,性能明智的提取请求可以使用优化,而过滤方法实际上是一个两阶段方法,首先将所有对象提取到NSSet中,然后将-filteredSetUsingPredicate:发送到NSSet,这是非核心的数据范围已经。

一种替代方法是在模型中使用获取请求模板,并使用[managedObjectModel fetchRequestFromTemplateWithName:substitutionVariables:]

在代码中实例化它们。

答案 1 :(得分:0)

你的推理是正确的。

我会添加NSFetchRequests提供更多的灵活性和优化请求的机会。

获取请求可以使用底层数据库中的索引。 获取请求可以将对象检索为故障,而不是将其完整加载。 获取请求可以预加载一些选定的属性。 他们甚至可以为您执行一些操作(请参阅NSExpressionDescription,NSExpression)。 ...

即使您需要使用一些内存中过滤(使用objectsWithOptions:passingTest:每个示例),您最好还是使用获取请求来预加载所需的对象和属性。在任何情况下,许多故障分辨率都会变慢。