Core Data确定保存和读取操作发生冲突的位置
问题描述:
tldr:在coredata获取过程中,我的应用程序崩溃,出现错误:'集合发生了枚举变异',我想弄清楚变异数据并因此导致崩溃的coredata保存。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];
}];
}
总的来说,我有很多的麻烦调试核心数据和似乎没有成为任何伟大的工具或资源,我可以利用,有没有人有任何资源让我查看?
答
问题是我保存的对象不是上下文创建的上下文。所以当我在这里运行提取时,它有时会与保存调用相冲突,并导致崩溃。
你看过http://*.com/questions/3446983/collection-was-mutated-while-being-enumerated-on-executefetchrequest – sschale
是的,我已经读过它。我添加了这个标志:-com.apple.CoreData.ConcurrencyDebug 1,现在正在处理它抛出无效操作异常的地方,但我不认为这是问题所在。 – Minimi