0

最初にかなりのサムネイル生成を行うメソッドを呼び出すコードがあるため、デバイスの速度が約 1 秒間低下します。最初のメソッドが呼び出される前に「読み込みメッセージ」を生成するメソッドを実行し、最初のメソッドが終了したら削除することを望んでいました。

[picker dismissViewControllerAnimated:YES completion:^{
    NSLog(@"Loading");
    [self generatingThumbnailMessageShow];
    [self loadAllEffects];

}];

問題は、「generatingThumbnailMessageShow」メソッドが「loadAllEffects」メソッドの前にあるにもかかわらず、「loadAllEffects」メッセージが終了した後に呼び出されるように見えることです。最初のメソッドが終了したときにのみ「loadAllEffects」メソッドを呼び出す最適な方法は何ですか?

4

1 に答える 1

3

問題は[self loadAllEffects]、メイン スレッドで実行され、UI をブロックすることです。UI への変更は、プログラム制御がメインの実行ループに戻った後にのみ表示されます。

の実行を[self generatingThumbnailMessageShow];バックグラウンド スレッドに移動する必要があります。

[picker dismissViewControllerAnimated:YES completion:^{
    NSLog(@"Loading");
    // Show "loading" message (must be done on main thread)
    [self generatingThumbnailMessageShow];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // perform long running task on background thread
        [self loadAllEffects];
        dispatch_sync(dispatch_get_main_queue(), ^{
            // Hide "loading" message (must be done on main thread again).
            [self generatingThumbnailMessageHide];
        })
    })

}];
于 2013-03-28T09:53:07.420 に答える