0

我有一个保存当前托管上下文的方法。

但是最近在这个方法中出现了一个错误。在我的程序中的某些位置(但不是所有时间),似乎此方法中的执行突然停止并且一切都停止执行......尽管没有崩溃。第一次执行有效。但是当我再次触发事件时,就会出现错误。

但是,如果我插入一个断点并一次执行一行方法,则一切正常。

基本上我从 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 左右。

4

1 回答 1

2

Core Data 不是线程安全的,请参阅有关 CoreData 并发的文档:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html

最简单的解决方案可能是致电tryLockunlock在您的NSManagedObjectContext

于 2013-04-04T20:33:48.107 回答