新しいプロジェクトでMVVMパターンを使用しようとしています。初めて、私は構造体にすべてのビューモデルを作成しました。しかし、クロージャでfetchDataFromNetworkなどの非同期ビジネスロジックを実装すると、クロージャは古いビューモデルの値を取得し、それを更新しました。新しいビューモデル値ではありません。Swift:ViewModelを構造体またはクラスにする必要がありますか?
ここには遊び場のテストコードがあります。
import Foundation
import XCPlayground
struct ViewModel {
var data: Int = 0
mutating func fetchData(completion:()->()) {
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: "http://stackoverflow.com")!) {
result in
self.data = 10
print("viewModel.data in fetchResponse : \(self.data)")
completion()
XCPlaygroundPage.currentPage.finishExecution()
}.resume()
}
}
class ViewController {
var viewModel: ViewModel = ViewModel() {
didSet {
print("viewModel.data in didSet : \(viewModel.data)")
}
}
func changeViewModelStruct() {
print("viewModel.data before fetch : \(viewModel.data)")
viewModel.fetchData {
print("viewModel.data after fetch : \(self.viewModel.data)")
}
}
}
var c = ViewController()
c.changeViewModelStruct()
コンソールは、私はクラスに、didSetは呼ばれないのViewModelを変更したがのViewControllerで表示モデルがある場合は
viewModel.data before fetch : 0
viewModel.data in didSet : 0
viewModel.data in fetchResponse : 10
viewModel.data after fetch : 0
問題は、新しい値10
を持っていないのViewControllerでビューモデルである出力します新しい値10.
したがって、非同期API呼び出し@codeでstructを使用する方法はありませんか?私はクラスよりも構造体を使うほうが好きですから。 – Paul
@Paul私の投稿を編集しました(再び)。 – Code
ええ、それは悪いデザインです。 :(この場合はクラスを使うべきです。ありがとう@コード。 – Paul