假设NSManagedObject
A
和一个B
。现在A
与B
之间存在多个bs
关系。
使用[A.bs filter...]
NSPredicate
NSFetchRequest
是非常方便的,但在B
上使用相同的谓词和匹配关系的条件构建lastObject
的速度可能会慢一些,或者我是误?
我猜这个性能问题更糟糕,如果你对结果做NSFetchRequest
之类的事情只能得到一个结果。 (fetchLimit
提供了NSFetchRequest
属性,可以用于此目的。)
在类似的说明中,如果您只对一两个属性感兴趣,propertiesToFetch
也会提供NSManagedObjects
属性。
我的理由是,直接使用关系需要核心数据将所有NSManagedObjectContext
提取到相关的NSFetchRequest
。虽然NSFetchRequest
可以在商店级别执行优化。
现在:
答案 0 :(得分:0)
是的,您的假设是正确的,性能明智的提取请求可以使用优化,而过滤方法实际上是一个两阶段方法,首先将所有对象提取到NSSet中,然后将-filteredSetUsingPredicate:发送到NSSet,这是非核心的数据范围已经。
一种替代方法是在模型中使用获取请求模板,并使用[managedObjectModel fetchRequestFromTemplateWithName:substitutionVariables:]
在代码中实例化它们。答案 1 :(得分:0)
你的推理是正确的。
我会添加NSFetchRequests提供更多的灵活性和优化请求的机会。
获取请求可以使用底层数据库中的索引。 获取请求可以将对象检索为故障,而不是将其完整加载。 获取请求可以预加载一些选定的属性。 他们甚至可以为您执行一些操作(请参阅NSExpressionDescription,NSExpression)。 ...
即使您需要使用一些内存中过滤(使用objectsWithOptions:passingTest:每个示例),您最好还是使用获取请求来预加载所需的对象和属性。在任何情况下,许多故障分辨率都会变慢。