Ich versuche, MVVM-Muster in meinem neuen Projekt zu verwenden. Zum ersten Mal habe ich mein gesamtes View-Modell zu struct erstellt. Aber wenn ich asynchrone Geschäftslogik wie fetchDataFromNetwork mit Closures implementierte, erfassen Closures den alten View-Modellwert und werden dann auf diesen Wert aktualisiert. Kein neuer AnsichtsmodellwertSwift: Sollte ViewModel eine Struktur oder Klasse sein?
Hier ist ein Testcode in Spielplatz.
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()
Console druckt
viewModel.data before fetch : 0
viewModel.data in didSet : 0
viewModel.data in fetchResponse : 10
viewModel.data after fetch : 0
Das Problem Ansicht Modell in Viewcontroller ist nicht über neuen Wert 10.
Wenn ich Ansichtsmodell in der Klasse geändert, didSet nicht genannt, aber Ansicht Modell in Viewcontroller hat neuer Wert 10.
So gibt es keine Möglichkeit, Struktur mit async API-Aufruf @Code zu verwenden? Weil ich lieber struct als class benutze. – Paul
@Paul Bearbeitete meine Post (wieder). – Code
Ja, das ist ein schlechtes Design. :(Ich sollte in diesem Fall Klasse verwenden. Danke @Code. – Paul