Swift での値型と参照型の違いについてはかなり認識しており、値型は不変の使用法として設計されていることを認識しています。しかし、特に構造体は自分自身を変異させる能力があり、それが私の懸念事項です。これらの変化する構造体値型を効果的に使用して、状態または変更を維持する方法。
私の質問は、iOS アプリの MVVM 設計では、ビュー モデルはクラスまたは構造体である必要がありますか? ビューモデルはモデル/モデルのリストを保持し、これらのモデルインスタンスは時間の経過とともに変化する可能性があるため (たとえば、ビューモデルは Web サービスリクエストからより多くのモデルインスタンスを取得し、モデルの配列に追加します)、ビューコントローラーのビューモデルはどのように更新されますか?この変更。これは疑似例ですが、最初にいくつかの考慮事項と簡単な説明を示します。
- ここではバインディングを使用していません。(RxSwiftなし)。
- KVO はありません。委任または完了ハンドラーの設計を使用しています。
例:
- ビューコントローラーにはビューモデルのインスタンスがあります。表示されると、ビューモデルにWebサービスからデータを取得するように依頼します。
- ビュー モデルがサービスを起動し、完了ハンドラークロージャーで応答を取得する
- このクロージャ ビュー モデルでは、いくつかのモデル インスタンスをモデルの配列に追加します。
- View Model は、View Controller の完了ハンドラを呼び出して、サービス要求の成功またはエラーを通知します。
- ビュー コントローラーは、ビュー モデルに対していくつかの検証を行い、それに応じて UI アクションを実行します。
モデルを見る:
struct DummyViewModel {
private var ints:[Int] = []
var count: Int {
return ints.count
}
init() {}
mutating func fetchData(completionHandler:(NSError? ) -> Void) {
Networking.getDataFromRemote() { response in
self.ints.append(1)
completionHandler(nil)
}
}
}
ビューコントローラー:
class DummyViewController: UIViewController{
private var dummyViewModel: DummyViewModel?
override func viewDidLoad() {
super.viewDidLoad()
/// Setup the view model
dummyViewModel = DummyViewModel()
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
loadData()
}
}
private extension DummyViewController {
func loadData() {
dummyViewModel?.fetchData { error in
if self.dummyViewModel?.count > 0 {
print("View model updated")
} else {
print("View model is still same")
}
}
}
}
上記のコードでは、ビュー モデルが応答を取得すると、その配列にデータが追加されますが、その変更がビュー コントローラーに渡されることはありません。これは、クロージャー内ではビュー コントローラーのモデルではなく更新されるビュー モデルのコピーであるためです。問題は、この変更がビュー コントローラーにどのように渡されるかです。
クロージャーから更新されたビューモデルインスタンスを返す必要があり、ビューコントローラーのクロージャー更新では、ビューモデルのインスタンスです。しかし、これもView Controllerの閉鎖のように機能しません.View Modelのコピーを更新しますか??
これにどのように対処する必要がありますか?1 つのオプションは、ビュー モデルをクラスにして、すべてを参照し、どこでも同じインスタンスを更新することです。しかし、ビューモデルとモデルでも同じことが起こり得るので、モデルもクラスになります。また、アプリの大部分はビュー コントローラーであるため、ビュー モデルと作成するモデルはすべてクラスです。したがって、ここでは値型の力を実際には使用していません。
助言がありますか?