我希望在我的新项目中使用MVVM模式。第一次,我将所有的视图模型都创建为结构体。但是当我实现包含闭包的异步业务逻辑(例如使用fetchDataFromNetwork从网络获取数据)时,闭包会捕获旧的视图模型值并更新到那个值上,而不是一个新的视图模型值。
这里是一个播放器中的测试代码。
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()
控制台输出
viewModel.data before fetch : 0
viewModel.data in didSet : 0
viewModel.data in fetchResponse : 10
viewModel.data after fetch : 0
问题是ViewController中的ViewModel没有新值10。
如果我将ViewModel更改为class,则didSet不被调用,但是ViewController中的ViewModel具有新值10。