私は現在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];
これは適切ですか?このパターンの問題について考えてください。このプログラムは非常に敏感で、私は楽器に何の問題も見ません。これを行うより良い方法はありますか?
申し訳ありませんが、この質問は長らく残念です。
ビジネスロジックでは、データがデバイスに残っていないと判断されるため、3番目の点にも対処します。あなたの第2の点について:あなたの思考過程を詳しく説明できますか? – Vinod
他のスレッドでdataModelが変更された場合、それらがdataModelの同じインスタンスを共有しているため、View Controllerに予期しない結果が生じることがあります。複数のスレッドで変更を行う場合は、dataModelへのアクセスをロックするか、NSObjectのperformSelectorOnMainThread:withObject:waitUntilDone:などのようなものを使用して変更が1つのスレッドでのみ行われるようにする必要があります。同じdataModelを共有するということは、あなたのデザインは単なるスレッドであることを意味します。あなたのデザインを実装する際には重宝するものです。 – Joel
わかりました。ありがとう – Vinod