0

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];
}
4

0 に答える 0