CoreData のものを実行する関数を書いています。すべての CoreData 操作が実行された後にのみ関数が返されるようにします。CoreData には、バックグラウンド コンテキストでオブジェクトを作成してから、親コンテキストでさらにいくつかの処理を行うことが含まれます。
+ (void) myFunction
NSManagedObjectContext *backgroundContext = [DatabaseDelegate sharedDelegate].backgroundContext;
[backgroundContext performBlockAndWait:^{
MyObject *bla = create_my_object_in:backgroundContext;
[backgroundContext obtainPermanentIDsForObjects:[[backgroundContext insertedObjects] allObjects] error:nil];
[backgroundContext save:nil];
[[DatabaseDelegate sharedDelegate].parent.managedObjectContext performBlockAndWait:^{
[[DatabaseDelegate sharedDelegate].parent updateChangeCount:UIDocumentChangeDone];
// Do some more stuff
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:someOperation];
}];
}];
return;
}
リターンが の後にのみ発生するようにし[queue addOperation:someOperation]
ます。これはほとんどの場合に機能するようですが、この関数が返されない場合が 1 つあります。デッドロックのように見えましたが、 が原因であると思われperformBlockAndWait
ます。
私の質問は次のとおりです。
(1) このデッドロックが発生する理由を誰か説明できますか?
と
(2) 同じ機能を実現する正しい方法は何ですか? 要件は、myFunction
両方のブロックが実行された後にのみ戻ることです。
ありがとうございました!