0

現在のマネージド コンテキストを保存するメソッドがあります。

しかし最近、このメソッド内でバグが発生しています。私のプログラムの特定の場所 (常にではありません) で、このメソッドの実行が突然停止し、すべての実行が終了したように見えますが、クラッシュはありません。最初の実行は機能します。しかし、イベントを再度トリガーすると、バグが発生します。

ただし、ブレークポイントを挿入して一度に 1 行ずつメソッドを実行すると、すべて正常に動作します。

基本的に、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 出力があります。繰り返しますが、これらのログのほとんどは、上記のコードの場合のように発生します。

このログは、一度に 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 に答える