2011-12-15 4 views
1

私は現在iPadアプリケーションを開発中です。ビジネス上の理由から、デバイス上にデータの永続性はありません。 NSURLConnectionを使用して、必要に応じてバックエンドサーバーからデータにアクセスします。私はすべてのネットワークアクセスを行う「モデル」オブジェクトを開発しました。 UIには、ルートコントローラーとしてUINavigationControlllerの中にテーブルビューコントローラーがあるスプリットビューコントローラーがあります。ユーザーは最終的に詳細ビューコントローラをロードするためにテーブルビューコントローラをドリルダウンします。モデルからテーブルビューセルの一部を動的に生成できるように、テーブルコントローラはUINavigationControllerにロードされているときにモデルオブジェクトへの参照を渡しています。応答するためには、ビュー内のModelオブジェクトのデリゲートが表示され、セルが選択されると、デリゲートメソッドを介してUIを更新するモデルオブジェクトをクエリするたびに、各Table Viewコントローラが自身を設定します。ViewControllers間でネットワークデータモデルを共有するためのデザインパターン

私の質問は、データモデルのデリゲートを設定したり解除したりするのに最適な場所です。現在のところ、ViewWillAppearのデリゲートを設定しており、ナビゲーションController:pushViewController:Animatedの直後にそれをnilに設定しています。

// Setting the delegate 
- (void)viewWillAppear:(BOOL)animated { 
// set ourself as the delegate 
[[self dataModel] setDelegate:self]; 

// Get the count of studies 
[[self dataModel]GetListOfDiagnosticStudyResultsForID:[[self currentPatient]patientID]]; 

} 

// setting delegate to nil 
DiagnosticStudiesViewController *selectedVC = [[DiagnosticStudiesViewController alloc] init]; 
selectedVC.dataModel = self.dataModel; 
[[self dataModel]setDelegate:nil]; 
[[self navigationController]pushViewController:selectedVC animated:YES]; 

これは適切ですか?このパターンの問題について考えてください。このプログラムは非常に敏感で、私は楽器に何の問題も見ません。これを行うより良い方法はありますか?

申し訳ありませんが、この質問は長らく残念です。

答えて

1

私は、これは大丈夫なアプローチだと思うが、なされるべき検討事項がいくつかあります:

  • あなたがに戻ったときにビューを更新する必要がありますので、あなたは2つのビューのデータモデルを共有していますDiagnosticsStudiesViewControllerの親(コード内にあります)は、dataModelデータの表示方法によって異なります。
  • コードをスレッドする必要がある場合、これは将来的には髪型になるかもしれません。この場合、DiagnosticsStudiesViewControllerに渡すdataModelのコピーを作成するか、dataModelへの編集をスレッドセーフな方法で処理する必要があります。
  • 明らかに、両方のView Controllerを動作させるにはネットワーク接続が必要です。これにより、サーバーからdataModelを取得して、2つのView Controllerでワークフローを決定しました。将来的には、これらのView Controllerの結合を解除するのは難しいかもしれません。

あなたのケースでうまく動作し、決定が下されなかった場合、私はあなたが大丈夫だと思います。

+0

ビジネスロジックでは、データがデバイスに残っていないと判断されるため、3番目の点にも対処します。あなたの第2の点について:あなたの思考過程を詳しく説明できますか? – Vinod

+0

他のスレッドでdataModelが変更された場合、それらがdataModelの同じインスタンスを共有しているため、View Controllerに予期しない結果が生じることがあります。複数のスレッドで変更を行う場合は、dataModelへのアクセスをロックするか、NSObjectのperformSelectorOnMainThread:withObject:waitUntilDone:などのようなものを使用して変更が1つのスレッドでのみ行われるようにする必要があります。同じdataModelを共有するということは、あなたのデザインは単なるスレッドであることを意味します。あなたのデザインを実装する際には重宝するものです。 – Joel

+0

わかりました。ありがとう – Vinod

関連する問題