0

私はまだiOSにかなり慣れていますが、以下のコードはうまくいくようです。バックグラウンドで行う作業がたくさんあるので、作業が完了している間、「ビジー インジケーター」がユーザーに表示されるはずです。しかし、ビジー インジケータが数秒間表示されません。ほとんどの作業 (すべてではない) が完了したときにのみ表示されます。

- (void) fetchDataTest {

    // next line will create and display a busy indicator
    __block MRProgressOverlayView *overlay = [MRProgressOverlayView showOverlayAddedTo:self.view title:@"Loading…" mode:MRProgressOverlayViewModeIndeterminate animated:YES];

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

        [self fetchData];

        dispatch_async(dispatch_get_main_queue(), ^(void) {
            [overlay hide:YES];
        });
    });
}

実行速度が非常に遅いログ (上には表示されていません) がたくさんありますが、出力ログ (スレッド ID を含む) を見て、オーバーレイが作成され、バックグラウンド作業が開始されていることを確認できますが、デバイスにオーバーレイが数秒間表示されません。

オーバーレイをすぐに表示するにはどうすればよいですか?

4

1 に答える 1

0

所見:

  1. 同期データ フェッチを非同期に見せるために GCD を使用しないでください。非同期フェッチを直接使用してください。全体的なスケジューリングとバッテリー寿命の点ではるかに優れています。
  2. 発生していないのは s の前に発生するビットでdispatch_asyncあり、その中のものではありません。
  3. Jack Wu の推測はおそらく正しいでしょう。どのスレッドまたはキューfetchDataTestで実行されているのでしょうか? これはメイン キューである必要があります。

最後の点: UIKit は一般的にスレッドセーフではありません。いくつかの例外を除いて、常にメイン キューから使用する必要があります。これは、今日のメイン キューの大部分を占めています。つまり、すべてのユーザー インタラクションです。その後、重い作業は別の場所に回すべきです。

于 2014-06-12T19:33:34.977 に答える