GCD
カスタムNSManagedObjectsと組み合わせたの誤った実装が原因のように見えるランタイムエラーが発生します。
呼び出しにネストされGCD
て、独自の管理対象オブジェクトコンテキスト(= self.managedObjectContext
)を持つ(と思われる)カスタムNSManagedObjectsを使用しています。
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
その後、アプリは通常、フェッチリクエストを実行するときに、次のメソッドのカスタムサブクラス化された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.
この問題について私を助けて、正しい管理対象オブジェクトコンテキストを渡すためにコードを改善する方法(またはすべてのメソッドで正しいコンテキストが使用されていることを確認する方法)についていくつかの提案をお願いします。
どうもありがとうございます!