2

たまにバックグラウンドでデータを同期するクラスがあります。ユーザーはアプリのナビゲーションツリーのどこにいてもかまいません。ユーザーがどこにいても、同期したばかりの新しいデータでViewControllerを更新できる必要があります。

SharedAppDelegateのプロパティとして、バックグラウンドスレッド同期を担当するオブジェクトを配置しました。

ある意味で、オブザーバーパターンのようなものを実装する必要があり、View Controllerをインスタンス化するたびに、バックグラウンド同期オブジェクトでイベントをリッスンするように設定します。これにより、同期のたびに、リッスンしているViewControllerでメソッドを実行できます。

Objective-Cでこれを行う正しい方法が何であるか、またはさらに良い方法や推奨される方法があるかどうかはわかりません。

4

1 に答える 1

2

目的にぴったり合うNSNotificationwithを使用してください。NSNotificationCenter

  • AppDelegateで、同期が終了したら、

    [[NSNotificationCenter defaultCenter] postNotificationName:@"SyncEnded" object:mySyncObject]
    
  • 表示するすべてのViewControllerで、

    _myObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"SyncEnded" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note){ ...your UI refresh code... }
    
  • また、オブザーバーが不要になった場合(ビューコントローラーの割り当てが解除された/アンロードされた/表示されない、あなた次第)を忘れないでください。そうしないと、NSNotificationCenterクラッシュしてしまいます。

    [[NSNotificationCenter defaultCenter] removeObserver:_myObserver];
    

いくつかのメモ:

この例では、ブロックベースのAPIを使用して、メインスレッド以外のスレッドでUIKit操作を実行してはならないため、メイン操作キュー(メインスレッドを意味する)でUI更新作業を実行します。これは、バックグラウンド同期が他のスレッドで通知を送信する可能性が高いため、メインスレッドに切り替える必要があります。セレクターベースのAPIを使用する場合は、必ずメインスレッドで通知を送信してください。

通知には必要な数のオブザーバーを登録できるため、これはパターンと完全に一致します(NSNotifications通常、同期終了などのアプリ全体のイベントのさまざまなアプリコンポーネントに通知するための最良の方法です)。

通知を投稿するときに渡されるパラメーターを使用すると、必要に応じてobjectオブザーバーブロックの同期オブジェクトにアクセスできます。note.object

于 2012-08-09T08:54:58.390 に答える