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