1

私はこの問題を抱えています:コントローラーはビューにデータを入力するためにそのデータを必要とするため、モデルにデータをロードするように要求します。モデルはデータ ストアにデータを要求し、データ ストアは再びデータベースにクエリを実行します。My Model は、結果を処理するロジックを含むブロックを送信します。

その後、問題が発生します。このデータをコントローラーに返す方法は? 非同期であるため、いつ完了するかわからないため、ブロック内またはブロック外にリターンを配置することはできません。

これを修正する2つの方法について考えました。

  • Controller にモデルへのコールバックとしてブロックを渡すようにします。これにより、独自のコールバック ブロックでそのコールバックが再度呼び出されます。
  • コントローラーがリッスンできる通知をモデルに投稿させます。

誰かがこれに対する良い解決策を持っていますか?

EDIT:リストの#1を明確にするために(コードはありません):私のコントローラーは、saveStuff:callback:モデルで呼び出し、stuffコールバックブロックを渡します。次に、モデルはデータ ストアに保存を要求しstuff、独自のコールバックをデータ ストアに渡します。次に行うことは、Models コールバック内で Controllers コールバックを呼び出すことです。それはもっと意味がありますか?

4

1 に答える 1

4

最善の解決策は、ブロックを完了ハンドラーとしてモデルに渡し、それを呼び出すことです。このようなもの

// model implementation
-(void)loadDatabaseOnCompletion:(void(^)(id result))completionHandler {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // loading data from server
        completionHandler(result);
    });
}

...
// from ViewController
[model loadDatabaseOnCompletion:^(id result) {

}];
于 2013-02-27T11:55:00.607 に答える