首页 文章

核心数据缓慢获取关系对象

提问于
浏览
2

我正在从Core Data加载所有 Node 实体,并提取请求,如下所示:

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Node"];
self.graphNodes = [self.viewController.objectContext executeFetchRequest:request error:&error];

实体 NodeDeparture 实体具有一对多的 orderedNSOrderedSet )关系 . 我直接和他们一起工作:

self.nodeDepartures = node.departures.array;
Departure* departure = self.nodeDeparturesReference[index]; //Slow operation

但是最后一个操作执行速度非常慢,而且我没有看到很多 NSSQLCore 方法的执行情况 . 这是一个被称为方法的image,但主要的是(按时间顺序):

[_NSFaultingMutableOrderedSet objectAtIndex:]
[_NSFaultingMutableOrderedSet willReadWithContents:]
[NSFaultHandler retainedFulfillAggregateFaultForObject:andRelationship:withContext:]
[NSPersistentStoreCoordinator(_NSInternalMethods) newValueForRelationship:forObjectWithID:withContext:error:]
... and cca. 20 more strange calls (check the image) ...

据我所知,发生了一些错误,程序无法找到所需的数据 . 我究竟做错了什么?请问任何想法 .

EDIT 1: 我发现这个问题出现了错误的关系(更多关于错误的here) . 问题是"solved"以及获取节点的新方法:

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Node"];
[request setReturnsObjectsAsFaults:NO];
[request setRelationshipKeyPathsForPrefetching:@[ @"departures" ]];
self.graphNodes = [self.viewController.objectContext executeFetchRequest:request error:&error];

无论如何,对我来说这是一个很好的解决方案,因为这个预取需要花费很多时间,但我需要立即使用 Nodes 数组 . 有没有办法在后台线程中预取 departures 属性并使用并行数组?

1 回答

  • 1

    你是在正确的轨道上,但每个节点有1000个左右的关系,你需要走得更远 .

    托管对象上下文维护已获取对象的内部缓存 . 您可能需要在需要之前通过提前获取对象来尝试“预热”缓存 . 尽早获取它们但不要使用它们 . 然后,当您需要它们时,再次获取,结果将来自缓存 .

    初始提取不需要请求完整的对象 . 您可以将 resultType 设置为 managedObjectIDResultType 并获得相同的结果 .

    如果您使用后台队列(即不使用主队列的队列),这将最有效 . 在需要结果之前,请告诉后台队列在后台执行此提取,然后不要使用结果 .

相关问题