NSOperation でいくつかのコア データ管理オブジェクトを使用する必要があります。問題は、コア データがスレッド セーフではなく、新しいスレッドからオブジェクトを読み込めないことです。誰かがこれのための良いチュートリアルを知っていますか? オブジェクトを読み取り専用にする必要があるため、スレッドはオブジェクトを変更しません。これらのオブジェクトがバックグラウンドで使用されている間に、他の無関係なエンティティがメイン スレッドに追加される場合がありますが、バックグラウンド エンティティを変更する必要はまったくありません。
うーん、バックグラウンド実行の問題を修正したようですが、問題はデリゲートに何も返されないことです...なぜですか? スレッドで nslog すると結果はすべて表示されますが、デリゲートへの呼び出しは発生しません
これはコードです:
-(void)evaluateFormula:(Formula *)frm runNo:(NSUInteger)runCount{
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:2];
NSManagedObjectID *formulaId = frm.objectID;
for (int i = 0; i < runCount; i++) {
NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runFormula:) object:formulaId];
[queue addOperation:op];
}
}
-(void)runFormula:(NSManagedObjectID *)fId {
NSManagedObjectContext *thredContext =[[NSManagedObjectContext alloc] init];
NSPersistentStoreCoordinator *coord = (NSPersistentStoreCoordinator *)[(PSAppDelegate *)[[UIApplication sharedApplication] delegate] persistentStoreCoordinator];
[thredContext setPersistentStoreCoordinator:coord];
Formula *f = (Formula *)[thredContext objectWithID:fId];
NSDictionary *vars = [self evaluateVariables:[f.hasVariables allObjects]];
NSMutableString *formula = [NSMutableString stringWithString:f.formula];
for (NSString *var in [vars allKeys]) {
NSNumber *value =[vars objectForKey:var];
[formula replaceOccurrencesOfString:var withString:[value stringValue] options:NSCaseInsensitiveSearch range:NSMakeRange(0, [formula length])];
}
//parse formula
NSNumber *result = [formula numberByEvaluatingString];
// NSLog(@" formula %@ result : %d",formula,[result intValue]);
//aggregate results
[self performSelectorOnMainThread:@selector(aggregate:) withObject:result waitUntilDone:YES]; // the delegate doesn't get called ...
}
-(void)aggregate:(NSNumber *)res {
[self.delegate didReceiveResult:res];
}