1

假设 aNSManagedObject A和 一B。现在A在 上具有一对多B关系bs。is [A.bs filter...]with someNSPredicate非常方便,但可能比NSFetchRequest使用B相同的谓词和条件来匹配关系更慢,还是我弄错了?

我想这个性能问题会更糟,如果你lastObject对结果做类似的事情来只获得一个结果。(NSFetchRequest提供fetchLimit可用于此目的的属性)。

同样,如果您只对一个或两个属性感兴趣,也可以NSFetchRequest提供一个propertiesToFetch属性。

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

现在:

  • 我的推理正确吗?因此,如果您对所有关系对象不感兴趣,请使用NSFetchRequest?
  • 有没有一种解决方案可以通过具有相似性能的关系来获得方便(并且显然更具可读性)的方法?
4

2 回答 2

0

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

一种替代方法是在模型中使用获取请求模板并在代码中使用 [managedObjectModel fetchRequestFromTemplateWithName:substitutionVariables:] 实例化它们

于 2012-06-19T07:30:55.213 回答
0

你的推理是正确的。

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

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

即使您需要使用一些内存过滤(例如使用 objectsWithOptions:passingTest:),您最好使用 fetch 请求来预加载您需要的对象和属性。在任何情况下,许多故障解决都会变慢。

于 2012-06-19T08:14:42.943 回答