Tôi đang cố gắng sử dụng mẫu MVVM trong dự án mới của mình. Lần đầu tiên, tôi tạo ra tất cả các mô hình xem của tôi để cấu trúc. Nhưng khi tôi triển khai thực hiện logic kinh doanh không đồng bộ như fetchDataFromNetwork với các bao đóng, các khung đóng lại nắm bắt giá trị mô hình xem cũ sau đó được cập nhật lên đó. Không phải là giá trị kiểu xem mới.Swift: ViewModel có nên là cấu trúc hay lớp không?
Đây là mã thử nghiệm trong sân chơi.
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()
điều khiển in
viewModel.data before fetch : 0
viewModel.data in didSet : 0
viewModel.data in fetchResponse : 10
viewModel.data after fetch : 0
Vấn đề là Xem các mẫu trong ViewController không có giá trị gia tăng mới 10
Nếu tôi thay đổi ViewModel lớp, didSet không được gọi nhưng Xem các mẫu trong ViewController có Giá trị mới 10.
Vì vậy, không có cách nào để sử dụng cấu trúc với lệnh gọi async API @Code? Bởi vì tôi thích sử dụng struct hơn class. – Paul
@Paul Đã chỉnh sửa bài đăng của tôi (một lần nữa). – Code
Vâng, đó là một thiết kế tồi. :(Tôi nên sử dụng lớp trong trường hợp này. Cảm ơn @Code. – Paul