0

ここに私の問題があります:私は文字通り何百万もの計算をしなければならないアプリを持っています(これは科学論文が出版されるためのものです)。

したがって、計算を高速化するために、スレッドについて少し学び、次のことを行いました。

dispatch_queue_t myFirstQueue =
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, myFirstQueue, ^{
    [Magic defineListOfSameDonInParticule:sharedData.particle];

    NSMutableDictionary *results = [Magic
            meanResultForSameDonInParticule:sharedData.particle];
});

そして、Magic.m私はこれがあるという名前のメソッドを持っていdefineListOfSameDonInparticule:ます:

[particule.donorsList enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
                     usingBlock: ^(id keyA, Molecule *alpha, BOOL *stop){

    [particule.donorsList enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
                   usingBlock: ^(id keyB, Molecule *beta, BOOL *stop2){

        if ([alpha isNotEqualTo:beta]) {
            float distance = [self distanceBetweenMolecule:alpha
                                               andMolecule:beta];

            [alpha.closestSame setObject:[NSNumber numberWithFloat:distance]
                                  forKey:beta.molID];

            [appDelegate increaseProgressionMeterByOne];
        }

    }];

私が持っているこのコードでは[appDelegate increaseProgressionMeterByOne]、アプリのデリゲートにメッセージを送信し、アプリのデリゲートがincrementBy:1をプログレスバーに送信します

しかし、すべてのスレッドが同時に発生する数百万の計算で使用されているため、UI がフリーズし、progressBar が先に進みません。

注意: 私の進行状況バーは、マルチスレッドを使用しないプログラムの他の部分で正常に動作します

UI を強制的に更新する方法はありますか? または、これを解決する方法について何か考えがありますか?

UI を更新するとアプリの速度が低下することはわかっていますが、アプリの対象者にとっては必要です。

どうもありがとう !

アップデート :

AppDelegate の UI を更新するコードは次のとおりです。

- (void)increaseProgressionMeterByOne {
    [progressBar incrementBy:1];
}
4

2 に答える 2

1

内に UI の更新をラップする必要がありますdispatch_async(dispatch_get_main_queue(), ^{});UIKit はスレッドセーフではありません

于 2014-05-27T16:29:17.277 に答える