Основные данные и 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.
Не могли бы вы помочь мне с этой проблемой и дать несколько советов о том, как улучшить мой код, чтобы он передавал правильный контекст управляемого объекта (или как убедиться, что правильный контекст используется во всех методах)?
Большое спасибо!