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



我正在加载所有来自核心数据的Node实体,并以此类提取请求:

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

实体Node具有一对多订购(NSOrderedSet(与Departure实体的关系。我直接与他们合作:

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

但是最后一个操作执行速度非常慢,我不明白为什么。在Xcode的时代剖面中,我看到了一些NSSQLCore方法的执行。这是称为方法的图像,但主要的图像是(按时间顺序排列(:

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

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

编辑1:我发现问题是有故障关系(有关此处的错误(。这个问题是通过新的获取节点的"解决"的:

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

无论如何,它是不是对我来说是一个很好的解决方案,因为这种预取的时间需要很多时间,但是我需要立即Nodes数组。有什么方法可以在背景线程中预取departures属性并并行使用数组?

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

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

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

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

最新更新