executeBlockAndWait создает тупик
Я пишу функцию, которая выполняет некоторые вещи 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]
, Кажется, это работает в большинстве случаев, но у меня был один случай, когда эта функция никогда не возвращалась. Казалось, что он зашел в тупик, и я подозреваю, что это из-за.performBlockAndWait
Мои вопросы:
(1) Может кто-нибудь объяснить, почему возникает этот тупик?
а также
(2) Как правильно достичь такой же функциональности? Требование заключается в том, чтоmyFunction
возвращает только после того, как оба блока были выполнены.
Спасибо!