tldr :在coredata fetch期间,我的应用程序因错误而崩溃:'枚举时收集变异'并且我想弄清楚变量数据因此导致此次崩溃的coredata保存。
我正在使用Magical Records对Core Data执行100次提取操作。这些获取操作在后台线程中执行。当这些提取正在运行时,我的应用程序中的某个地方执行保存。现在,显然当这个保存发生时,我的应用程序崩溃,因为它更改了其他ManagedObjectContext中的数据。
我找不到保存的位置,因为它是从不同的线程运行的,所以回溯最远的是“开发人员提交的块到developerSubmittedBlockToNSManagedObjectContextPerform
首先,在我使用单独的上下文执行提取时,如何从另一个线程上的另一个上下文进行更改会导致崩溃?
如何确定此保存的位置?
如何解决此问题?
如何为这种情况的其他实例调试应用程序并不那么明显?
这就是我执行100次获取请求的方式:
- (instancetype) initWithUserSession:(BPDUserSession*)userSession{
...
self.context = [NSManagedObjectContext MR_context]; // new context, root is parent, private type
[self buildAndFetchFRCsInContext:self.context];
...
}
- (void) buildAndFetchFRCsInContext:(NSManagedObjectContext*)context {
self.contactsFRC = [self buildFetchResultsControllerForClass:[Contact class] sortedBy:@"id" withPredicate:nil inContext:context];
self.callsFRC = [self buildFetchResultsControllerForClass:[Call class] sortedBy:@"id" withPredicate:nil inContext:context];
self.newsItemsFRC = [self buildFetchResultsControllerForClass:[NewsItem class] sortedBy:@"id" withPredicate:nil inContext:context];
NSMutableArray *list = [[NSMutableArray alloc] initWithCapacity:100];
for (int i = 0; i < 100; i++) {
list[i] = [self buildFetchResultsControllerForClass:[NewsItem class] sortedBy:@"id" withPredicate:nil inContext:context];
}
[context performBlock:^{
__unused NSDate* start = [NSDate date];
NSError* error;
// Peform the fetches
[self.contactsFRC performFetch:&error];
[self.callsFRC performFetch:&error];
[self.newsItemsFRC performFetch:&error];
for (int i = 0; i < list.count; i++) {
[list[i] performFetch:&error];
}
NSLog(@"Spent [%@s] performing fetchs for counts!", @(fabs([start timeIntervalSinceNow])));
[self calculateAndBroadcastCounts];
}];
}
总的来说,我在调试Core Data时遇到了很多麻烦,似乎没有任何可以使用的优秀工具或资源,是否有人有任何资源供我查看?
答案 0 :(得分:0)
问题是我是从一个上下文中保存对象,而这个上下文并不是他们创建的上下文。所以当我在这里运行fetch时,它有时会与save调用冲突,我们会崩溃。