現在、私はマルチスレッド環境で使用されている新しいCoreDataアーキテクチャを検証中です。解析のために、私はGDCoreDataConcurrencyDebuggingを使用しています。これは、ManagedObjectが間違ったスレッド/キューからアクセスされるたびに(私が理解する限り)警告を出力します。CoreData並行性と解放オブジェクト
は今、私はこのような警告のトンを取得しています:
Invalid concurrent access to managed object calling 'release'
私は警告が生成されたブレークポイントを置くことができたとのコードは次のようになります。
-(MyObject*) createMyObject {
return (MyObject*)[self insertNewObjectEntityWithName:@"MyObject"];
}
-(NSManagedObject*) insertNewObjectEntityWithName:(NSString*) entityName {
__block NSManagedObject *managedObject;
[self.managedObjectContext performBlockAndWait:^(void) {
managedObject = [NSEntityDescription insertNewObjectForEntityForName:entityName
inManagedObjectContext:self.managedObjectContext];
}];
return managedObject;
}
その復帰後のcreateMyObject
メソッドの破損は、オブジェクトがリリースされたときのことです。 CoreDataの同時実行とオブジェクトリリースで見逃したことはありますか? 私は周りを見回して、オブジェクトリリースに関して何も言及されていません、私が使用していないオートリースプールについてのみです。
お返事ありがとうございました。だから、基本的には私の実行ブロックから何かオブジェクトを出すことは許されていないのですか? – TMob
正しい。通常は、同じコンテキスト内で呼び出された補完ブロックを使用するか、 'objectID'を渡して別のコンテキストに再フェッチします。 – Avi
ああああ。私たちは多くのソフトウェアアーキテクチャを改造しなければならないと思います。ありがとうございました – TMob