我有一个保存当前托管上下文的方法。
但是最近在这个方法中出现了一个错误。在我的程序中的某些位置(但不是所有时间),似乎此方法中的执行突然停止并且一切都停止执行......尽管没有崩溃。第一次执行有效。但是当我再次触发事件时,就会出现错误。
但是,如果我插入一个断点并一次执行一行方法,则一切正常。
基本上我从 JSON 连接获取数据,然后保存这些对象。在我保存对象的方法中,我调用了“saveManagedContext”方法,这就是发生错误的方法。
- (void)saveManagedObjectContext
{
NSLog(@"saving context 1");
NSManagedObjectContext *managedObjectContext;
// get the context for the current thread
NSThread *currentThread = [NSThread currentThread];
if ([currentThread.name isEqual:THREAD_NAME]) {
NSLog(@"saving context 2");
managedObjectContext = _backgroundQueueManagedObjectContext;
} else {NSLog(@"saving context 3");
//managedObjectContext = _managedObjectContext;
managedObjectContext = [self managedObjectContext];
}
NSLog(@"saving context 4");
NSError *error = nil;
if (managedObjectContext != nil) {
NSLog(@"saving context 5");
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSLog(@"saving context 6");
[self logError:error];
//abort();
}
}
NSLog(@"saving context 7");
}
我几乎在每一行都插入了一个 NSLog 并且执行通常在之后停止NSLog(@"saving context 5");
这个方法在单独的线程中被调用,我有一个理论,它被访问的时间相对接近于同时导致冲突。这是我打印的一些 NSLog 输出。同样,这些日志中的大多数都出现在上面的代码中,在 If 等下。
此日志是事情一次正确执行 1 行。
connection complete 10
connection has results
start saving json objects
end saving json objects
connection complete saving context
saving json objects thread block 1
saving context 1
saving json objects thread block 3
saving context 3
saving context 4
saving context 5
saving json objects thread block 4
saving json objects thread block 6
saving context 1
saving context 2
saving context 4
saving context 5
saving context 7
saving context 7
saving json objects thread block 7
inside block 1
inside block 2
这个日志是它挂起的时候。
connection complete 10
connection has results
start saving json objects
end saving json objects
connection complete saving context
saving context 1
saving context 3
saving context 4
saving context 5
saving json objects thread block 1
saving json objects thread block 3
saving json objects thread block 4
saving json objects thread block 6
saving context 1
saving context 2
saving context 4
saving context 5
尽管如此,我已经看到执行停止并显示不同的日志,但通常是在保存上下文 5 左右。