0

複数のファイルに対して非常に大量の計算を行うアプリを作成しているため、進行中のすべてを追跡するために、NSProgressIndicator (値 0-100) を追加しました。

アプリにはコンソールもあるので、logConsole:メソッドはそのコンソールに書き込みます。

私のループは次のようになります。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){

    for(int i = 0; i < _files.count; i++)
    {

        //Do calculations

        dispatch_async(dispatch_get_main_queue(), ^(void){

            [_progressBar setDoubleValue: ((i+1) / _files.count) * 100];
            [self logConsole:[NSString stringWithFormat:@"Completed file #%d", (i+1)]];

        });

    }

});

このループが実行されると、メッセージはアプリのコンソール (私が作成した実際の G​​UI コンソールである NSLog ではありません) に非同期的に記録されますが、進行状況バーは for ループ全体が完了するまで変化しません。

5 つのファイルがある場合、次のようになります。

LOG: Completed file #1
Progress bar at 0
LOG: Completed file #2
Progress bar at 0
LOG: Completed file #3
Progress bar at 0
LOG: Completed file #4
Progress bar at 0
LOG: Completed file #5
Progress bar at 100

プログレス バーが更新されないのはなぜですか? メインスレッドで実行されています。

4

1 に答える 1

4

浮動小数点値にはならない整数演算を行っているようです。doubleこれを行うには、値を としてキャストする必要があります。

double progress = (((double)i) + 1.0) / ((double)_files.count);
[_progressBar setDoubleValue:progress * 100.0];

プログレス バーのminValueとを適切に設定すれば、100.0 を掛ける必要がないことにも注意してください(デフォルトは 0.0 と 100.0 です)。maxValueほとんどの場合、これを入れたいと思うでしょうviewDidLoad

[_progressBar setMinValue:0.0];
[_progressBar setMaxValue:1.0];
于 2015-10-09T22:25:40.250 に答える