我收到运行时错误,这似乎是由于我不正确地GCD
结合我的自定义 NSManagedObjects 实现的。
嵌套在GCD
调用中,我正在使用自定义 NSManagedObjects,它(似乎)有自己的托管对象上下文(= self.managedObjectContext
)。
我正在使用提供的托管对象上下文在应用程序委托中创建托管对象上下文UIManagedDocument
:self.managedDocument.managedObjectContext
。
我不明白如何将正确的托管对象上下文传递给我的自定义 NSManagedObjects。我需要如何更改我的代码以使用正确的托管对象上下文?
这是我的主要方法(在视图控制器内):
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
是我的自定义子类 NSManagedObject 中的一种方法,ReportedPeriod
并使用其(默认)托管对象上下文self.managedObjectContext
。
CoaMap
然后,应用程序在执行 fetch 请求时通常会在以下方法中的自定义子类 NSManagedObject 中崩溃:
+ (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.
您能否帮我解决这个问题,并就如何改进我的代码以传递正确的托管对象上下文(或如何确保在所有方法中使用正确的上下文)给我一些建议?
非常感谢!