Вы не можете работать с NSManagedObjectContext в произвольной очереди.Вам нужно использовать очередь контекста.Это означает, что ваш вызов будет objectWithID:
в context.perform()
(асинхронный) или context.performAndWait()
(синхронизация).
Вообще говоря, вы должны использовать очередь контекста вместо создания собственной NSOperationQueue
, ноесли по какой-то причине вам нужна собственная очередь, это нормально;вам просто все еще нужно использовать очередь контекста для операций контекста.
См. Руководство по программированию основных данных: параллелизм для получения полной информации.
Из ваших комментариев,Вы написали следующее:
NSManagedObjectID *objID = [event objectID];
[self.pc.viewContext performBlockAndWait:^{
NSManagedObjectContext *context = self.pc.newBackgroundContext;
Event *bgEvent = [context objectWithID:objID];
}];
Это неверно, и причина вашей проблемы.Вы не можете использовать context
в очереди viewContext
.Я полагаю, что вы имеете в виду здесь:
NSManagedObjectID *objID = [event objectID];
NSManagedObjectContext *context = self.pc.newBackgroundContext
[context performBlock:^{
Event *bgEvent = [context objectWithID:objID];
....
}];
Вам необходимо использовать context
внутри собственного perform block
, а не блока perform
какого-либо другого контекста.
Это не будетимеет смысл использовать performBlockAndWait
здесь, так как это заблокирует основную очередь.Вместо этого он будет асинхронно выполнять этот блок в фоновой очереди, что, я считаю, именно то, что вы пытаетесь сделать.