4

ビューの読み込みに時間がかかるViewControllerがあります。Instrumentsを実行すると、ホーム画面から、そのView Controllerをスタックにプッシュするアイコンをタップすると、半分がビューをレイアウトし、半分がビューのデータを取得していることがわかります。ボタンが押されたときにホーム画面のボタンの上に表示するアクティビティインジケーターを追加して、LongRunningViewControllerをスタックにプッシュしてみました。だから私は基本的にこれを行います:

- (IBAction)puzzleView:(id)sender {
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.activityIndicator startAnimating];
    });

    PuzzleViewController *detailViewController = [[[PuzzleViewController alloc] init] autorelease];
    [self.navigationController pushViewController:detailViewController animated:YES];
    [self.activityIndicator stopAnimating];
}

ボタンを押している間、ホーム画面が遅れて、ビューが読み込まれます。他の画面を押す準備をしているときにアクティビティインジケーターを表示しようとしています(または、少なくともそれが機能すると思います)。ただし、アクティビティインジケータは表示されません。これができるかしら?または、他のアプリがViewControllerをプッシュし、その画面に、さまざまなリソースの読み込みを示すアクティビティインジケーターが表示されますか?

4

1 に答える 1

9

ビューのデータを取得するのに時間がかかると言うとき、私はあなたがのPuzzleViewControllerようなどこかで重要なことをしていることを意味していると思いますviewDidLoad

それで、それがにあるとしましょうviewDidLoad。次に、これを行うことができます:

-(void)viewDidLoad
{
  [self.activityIndicator startAnimating];
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
    {
         //do something expensive
         [self doSomethingExpensive];

         //dispatch back to the main (UI) thread to stop the activity indicator
         dispatch_async(dispatch_get_main_queue(), ^
         {
            [self.activityIndicator stopAnimating];
         });
    });
}

これは、コストのかかる操作がバックグラウンドスレッドに配置され、ViewControllerのロード/表示をブロックしないことを意味します。

このアプローチでは、ユーザーがボタンを押すとすぐに要求されたビューが表示され、その画面に進行状況が表示されます。ビューを表示する前にコンテンツをロードしているときにアクティビティビューを表示するよりも、この方法の方が一般的だと思います。これにより、もう少し時間がかかります。トランジションアニメーション中に、長い操作をバックグラウンドで実行できます。

アクティビティビューに実行方法が表示されない理由は、すべてUIスレッドで実行しているためです。dispatch_async実行ループが完了するまでブロックを実行する機会がないため、メインキューからメインキューを使用しても何も実行されません。

于 2012-09-24T21:47:03.163 に答える