【发布时间】:2018-09-06 06:26:24
【问题描述】:
我正在从 Core Data 加载所有 Node 实体,获取请求如下:
NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Node"];
self.graphNodes = [self.viewController.objectContext executeFetchRequest:request error:&error];
实体Node 与Departure 实体具有一对多有序 (NSOrderedSet) 关系。我直接与他们合作:
self.nodeDepartures = node.departures.array;
Departure* departure = self.nodeDeparturesReference[index]; //Slow operation
但是最后一个操作执行得很慢,我不明白为什么。在 XCode 的时间分析器中,我看到很多 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) ...
据我所知,发生了一些错误,程序找不到所需的数据。我究竟做错了什么?请有任何想法。
编辑 1: 我发现问题在于错误关系(更多关于错误here)。问题已通过获取节点的新方法“解决”:
NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Node"];
[request setReturnsObjectsAsFaults:NO];
[request setRelationshipKeyPathsForPrefetching:@[ @"departures" ]];
self.graphNodes = [self.viewController.objectContext executeFetchRequest:request error:&error];
无论如何,这对我来说不是一个好的解决方案,因为这种预取需要很多时间,但我需要立即使用Nodes 数组。有没有办法在后台线程中预取departures属性并并行使用数组?
【问题讨论】:
-
您可以尝试在您的构建方案中将
-com.apple.CoreData.SQLDebug 1添加到“启动时传递的参数” - 这将导致控制台记录核心数据正在执行的 SQL 查询,并且可能会深入了解什么是出错了 -
出于兴趣,如果关系是无序的会更快吗?你可以使用无序对象,然后在内存中排序吗?
-
您的 Departure 架构中是否有一些“重”对象会导致获取时间变慢(图像、blob > 1 Mo)?
-
这个有序关系中大概有多少个对象?
-
感谢您的回复。 @pbasdf 不幸的是,我需要对这些实体进行排序。 @FlorianBurel 在出发实体中,我有 1x
String、2xInteger 16、3xDate和 4x 一对一关系。 @TomHarrington 我总共有 ~1'500'000 次出发(每节点约 1`000)。
标签: ios objective-c xcode core-data