2017-08-17 10 views
0

ここに私のコアデータ操作のコードスニペットがあります。ほとんどの場合、大丈夫です。しかし、今では、コアデータのデバッグ引数を追加して、すべてのコアデータ呼び出しがマルチスレッドCore Data Concurrency Debuggingに関して正常かどうかを確認すると、[contexts reset]行にクラッシュが発生しています。 。[managedObjectContext reset]でコアデータがクラッシュする。

- (void)readAllModelObjects { 

NSFetchRequest * fr = [NSFetchRequest ....] 

NSManagedObjectContext * context = [selg getChildContext]; 

    [context performBlockAndWait:^{ 

     NSArray * resultArray = [context executeFetchRequest:fr error: nil ]; 

     NSArray * nonCoreDataModelObjectsArray = [self parseCoreDataObjectsToModel: resultArray]; 

     _memberResultArray = nonCoreDataModelObjectsArray ; 

    }]; 

    [context reset]; // This is the line it crashes .  
} 


- (NSManagedObjectContet *)getChildContext { 

    NSManagedObjectContext * privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 

    privateContext.parentContext = [self mainQueueManagedObjectContext]; 

    return privateContext ; 
    } 


- (NSArray *)parseCoreDataObjectsToModel:(NSArray *)cdObjectsArray { 

    // creates and initializes the model objects array (non managed object class objects) from core data objects 
    // return this array 
    } 
  • 永続ストアコーディネーターに取り付けただけで一つのメインキュー・コンテキストがあります。これは、コアデータ操作用に作成された各子コンテキストの親として使用されます。

  • (void)readAllModelObjectsは、期待どおりバックグラウンドスレッドから呼び出されます。

私は、任意のヒント/提案は間違いなくクラッシュを考え出すの私を助ける

CoreData`+[NSManagedObjectContext _ 
_Multithreading_Violation_AllThatIsLeftToUsIsHonor__]: 

コアデータからエラーの下になった、助けてください。

答えて

1

managedObjectの値を変更すると、変更内容はコンテキストが保存されるまで保存されません。コンテキストを保存すると、コンテキストはディスクに書き込まれるか、親コンテキストにプッシュされます。これは、1つの単位として行われるいくつかの変更を行う方法です。データベースでは、トランザクションと呼ばれることがあります。 resetこれらの変更を元に戻します。したがって、変更するオブジェクトを正しいスレッドで実行する必要があるように、変更を元に戻すresetは正しいスレッドで実行する必要があります。

文脈を変更していないため、resetに電話する必要はありません。コンテキストには、resetによって元に戻す変更はありません。 resetに電話する場合は、performBlockAndWaitの内部で行う必要があります。

TD; DR[context reset]はスレッドセーフではなく、正しいスレッドから実行する必要があります。

+0

コアデータからオブジェクトを読み取っているときにresetを呼び出すことが役に立たない理由を詳しく説明してください。 –

関連する問題