0

タブバーコントローラーを起動するアプリがあります。アプリが起動するか、バックグラウンドから戻ると、サーバーのデータの更新を確認します。更新が利用可能な場合、データを取得して更新するのに数秒かかる場合があります。

アプリのデータが更新されていることをユーザーに通知するオーバーレイビューを表示し、数秒お待ちください。私がこれを行おうとしている方法は次のとおりです:私が持っている更新を処理する私のクラスでは:

AppDelegate *delegate = [UIApplication sharedApplication].delegate;
[delegate.tabBarController.selectedViewController.view addSubview:updatingDataView];
[self runUpdateMethods];

問題は、updatedDataViewが、updateメソッドが完了した後にのみ画面に表示されることです。更新メソッドが開始する前に表示するにはどうすればよいですか?

4

3 に答える 3

6

メインスレッドで実行[self runUpdateMethods];しているようです(これにより、UIの更新がブロックされます)。これをバックグラウンドスレッドで実行することをお勧めします。何かのようなもの:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),
               ^{
                   [self runUpdateMethods];
               });

また

[self performSelectorInBackground:@selector(runUpdateMethods) withObject:nil];

アップデート

完了後に何かをしたいので、[self runUpdateMethods];次のようなことをしたいと思うでしょう:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), 
^{
    [self runUpdateMethods];

    dispatch_async(dispatch_get_main_queue(), ^{
        [self doSomethingAfterUpdate];
    });    
});

このようにすると、いつ戻ってくるかを知ることrunUpdateMethodsができ、UIがハングすることはありません。

于 2012-08-28T18:57:26.317 に答える
2

更新メソッド(接続)は、UIの更新をブロックするメインスレッドで実行されている可能性があります。更新を実行するには、非同期メソッド(gcd、NSThread、NSOperationQueueなど)を使用する必要があります。

于 2012-08-28T18:58:17.913 に答える
1

追加したビューが画面に描画されるように、実行ループを空にする必要があります。iOSでの描画はリアルタイムでは行われません。基本的に描画を設定してメソッドを終了すると、実行ループが実際に描画します。したがって、実行する必要があるのは、ルーチンを終了するまでrunUpdateMethodsの実行を遅らせることです。代わりに試してください:

[self performSelector:@selector(runUpdateMethods) withObject:nil afterDelay:0.0];
于 2012-08-28T18:59:46.220 に答える