Основные данные и GCD: передача правильного контекста управляемого объекта в пользовательские объекты NSManagedObject

Я получаю ошибки во время выполнения, которые, кажется, являются результатом моей неправильной реализацииGCD в сочетании с моими пользовательскими NSManagedObjects.

Вложенный вGCD вызов, я использую пользовательские NSManagedObjects, которые (кажется) имеют свои собственные контексты управляемого объекта (=self.managedObjectContext).

Я создаю контекст управляемого объекта в делегате приложения, используя контекст управляемого объекта, предоставленныйUIManagedDocument: self.managedDocument.managedObjectContext.

Я не понимаю, как передать правильный контекст управляемого объекта моим пользовательским объектам NSManagedObject. Как мне нужно изменить свой код, чтобы использовать правильный контекст управляемого объекта?

Это мой основной метод (внутри контроллера представления):

dispatch_queue_t queue;
queue = dispatch_queue_create("queue", NULL);
dispatch_async(queue, ^{
// ...
NSDecimalNumber *value = [reportedPeriod 
   valueForCoa:figure.code 
   convertedTo:self.currencySymbol];
// ...});
}

В этом основном методе у меня нет ссылки на контекст управляемого объекта, я просто вызываюvalueForCoa:convertedTo: (который закодирован следующим образом):

- (NSDecimalNumber*)valueForCoa:(NSString*)coaStr
convertedTo:(NSString*)targetCurrencyStr {
// ...
CoaMap *coa = [CoaMap coaItemForString:coaStr
   inManagedObjectContext:self.managedObjectContext];
// ...
}

valueForCoa метод в моем собственном подклассе NSManagedObjectReportedPeriod и использует его (по умолчанию) контекст управляемого объектаself.managedObjectContext.

Затем приложение обычно падает в пользовательском подклассе NSManagedObject.CoaMap в следующем методе, когда он выполняет запрос выборки:

+ (CoaMap*)coaItemForString:(NSString*)coaStr 
inManagedObjectContext:(NSManagedObjectContext*)context {

NSFetchRequest *request = [NSFetchRequest 
fetchRequestWithEntityName:NSStringFromClass([self class])];
NSPredicate *predicate = 
   [NSPredicate predicateWithFormat:@"coa == %@",coaStr];
   request.predicate = predicate;
// ** The runtime error occurs in the following line **
NSArray *results = [context executeFetchRequest:request error:nil];
// ...
}

Сообщение об ошибке:Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x9a8a4a0> was mutated while being enumerated.

Не могли бы вы помочь мне с этой проблемой и дать несколько советов о том, как улучшить мой код, чтобы он передавал правильный контекст управляемого объекта (или как убедиться, что правильный контекст используется во всех методах)?

Большое спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос