2

バックグラウンド スレッドを使用して、iPad で計算を実行しようとしています。問題は、あなたが計算を実行していることです。実行中にUIがブロックされます...何が間違っていますか。

[mc evaluateFormula:adapted runNo:10000];

これは IBAction から呼び出されます。

呼び出されるコードは次のとおりです。

-(void)evaluateFormula:(NSDictionary *)frm runNo:(NSUInteger)runCount
{

    self.runCount = runCount;
    self.frm = frm;
    [self performSelectorInBackground:@selector(backgroundEvalFrm) withObject:nil];

//    for (int i = 0; i < runCount; i++) {
//        [self runFormula:frm];
//    }
//    

}

-(void)backgroundEvalFrm
{
    percentVal = self.runCount / 100;
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue setMaxConcurrentOperationCount:20];



    for (int i = 0; i<self.runCount; i++) {
        NSInvocationOperation *op =[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runFormula:) object:self.frm];
        [queue addOperation:op];

    }

}

では、なぜ UI がブロックされているのでしょうか。

これがスレッドの戻りコードです...すべて同じクラスにあります

-(void)runFormula:(NSDictionary *)frm
{
    NSMutableString *formula = [[frm objectForKey:kFormulaExpresion] mutableCopy];
    NSArray *variables = [frm objectForKey:kVariableArray];
    NSArray *evals = [self evaluateVariables:variables];


       for (NSDictionary *var in evals) {
           NSString *sym = [var objectForKey:kVariableSymbol];
           [formula replaceOccurrencesOfString:sym withString:[[var objectForKey:@"numVal"] stringValue] options:NSCaseInsensitiveSearch range:NSMakeRange(0, [formula length])];
    }
    //parse formula
    //NSLog(@"formula to parse:%@",formula);
    NSNumber *resNo = [formula numberByEvaluatingString];
    // NSLog(@"formula %@ the result : %f",formula,[resNo doubleValue]);
    //NSNumber *resNo = [NSNumber numberWithDouble:result];
    [self performSelectorOnMainThread:@selector(addNewResult:) withObject:resNo waitUntilDone:NO];
}

#pragma mark -- data aggregation delegate
-(void)addNewResult:(NSNumber *)nr
{
     NSLog(@"index : %i result: %f",currentIndex,[nr doubleValue]);
    [[self delegate] didReceiveResult:nr];
    resultsArray[currentIndex]=[nr doubleValue];
    currentIndex ++;
    if (  (currentIndex % percentVal) == 0) {
        [[self delegate] percentCompleted];
    }
}
4

1 に答える 1

1

計算がすべて同じリソース (つまり、CPU または I/O) に対して調整されていない方法で競合している場合 (可能性が高い)、最大同時操作数を大幅に減らす必要があります -- 2 を試してください。時間/エネルギー。さらに、計算が実行されている間、メイン スレッドが CPU 時間の 5% 未満に削減されることはありません (結果: UI の応答性が向上します)。

于 2013-02-22T11:43:54.627 に答える