2

バックグラウンド タスクが完了したときに、iPhone アプリの IOS プログラムでメイン UI スレッドへの通知を取得するにはどうすればよいですか?

バックグラウンド

  • iPhone アプリケーションのスプラッシュ画面に UIActivityIndi​​cator を追加する方法の概念に従って、読み込みインジケーターをセットアップしようとしています。
  • AppDeleteで「performSelectorInBackground」を使用してモデルデータをロードしようとしていました
  • したがって、必要なのは RootViewController で、バックグラウンドでデータのロードが完了したことを通知して、(a) テーブルビューをデータで更新し、(b) アクティビティ インジケーターを削除できるようにすることです。
  • 私はここで物事を行う方法を次のように仮定しています:
    • App Delegate didFinishLaunchingWithOptions でモデル データの読み込みをバックグラウンドに渡す
    • AppDelegate は RootViewController をロードし、すぐにアクティビティ インジケーターをセットアップします
    • データがバックグラウンドでロードされると、これが完了したことを RootViewController (? この質問の理由) に示す必要があります。
    • 2番目の質問は、おそらくバックグラウンドタスクが終了したことを示すときでもあります.RootviewControllerは、アクティビティインジケーターを無効にする前に、UIが(アクティビティインジケーターなどで)セットアップされたことをどのように確認できますか
4

2 に答える 2

3

-performSelectorOnMainThread:withObject:waithUntilDone:次のように使用して、バックグラウンドセレクターからメインスレッドにコールバックできます。

- (void)loadModel
{
    // Load the model in the background
    Model *aModel = /* load from some source */;

    [self setModel:aModel];
    [self performSelectorOnMainThread:@selector(finishedLoadingModel) withObject:nil waitUntilDone:YES];
}

- (void)finishedLoadingModel
{
    // Notify your view controller that the model has been loaded
    [[self controller] modelLoaded:[self model]];
}

更新:これを行うさらに安全な方法は-finishedLoadingModel、メインスレッドで実行していることを確認するためにチェックインすることです。

- (void)finishedLoadingModel
{
    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:_cmd withObject:nil waitUntilDone:YES];
    }
    // Notify your view controller that the model has been loaded
    [[self controller] modelLoaded:[self model]];
}
于 2011-11-07T01:36:45.280 に答える
1

バックグラウンドでの読み込みが完了したら、バックグラウンドスレッドから次のコマンドを呼び出します。

[self performSelectorOnMainThread:@selector(backgroundLoadingDidFinish:) withObject:nil waitUntilDone:NO];

-(void)backgroundLoadingDidFinish:(id)sender次に、RootViewControllerに実装します。必要に応じて、上記の方法(withObject:パーツ)でデータを返すことができます。

于 2011-11-07T01:39:15.330 に答える