使用MVVM与一个复杂的模型结构
问题描述:
所以我使用MVVM架构和我已经构建了一个相当复杂的视图,所以我决定将视图分成不同的类,然后使用不同的视图模型为每个分离查看组件。我也使用协调器(所以MVVMC基本上),我使用协调员来设置我的视图控制器,然后创建视图模型并将其注入单独的视图组件,通过我的主视图中的IBOutlets可以访问这些组件。使用MVVM与一个复杂的模型结构
我的问题是,我正在使用CoreData,我试图保存一个具有多个关系的NSManagedObject,但是关系模型仅在我的其他视图模型中可用,这些模型连接到我的单独视图组件。有没有一种干净的方式,当我的主视图中点击保存按钮时,我可以给我的ViewController拥有的主视图模型和其他视图模型的关系模型。或者我应该考虑使用委托模式,告诉我的其他视图模型保存按钮被点击了?
答
所以我认为有几种可能性。以下是我如何管理几乎类似的情况,我希望它能帮助你进行思考。
首先我为我的Viewmodels创建协议。例如:
protocol Child1ViewProtocol {
func getFirstName() -> String
}
protocol Child2ViewProtocol {
func getLastName() -> String
}
protocol MainViewProtocol {
func getChildModel1() -> Child1ViewProtocol
func getChildModel2() -> Child2ViewProtocol
func getLanguage() -> String
func saveButtonPressed()
}
然后我创建我的ViewModel类。这里是孩子,很容易:
class Child1ViewModel: Child1ViewProtocol {
var firstName: String?
init(firstName: String?) {
self.firstName = firstName
}
func getFirstName() -> String {
return self.firstName ?? ""
}
}
class Child2ViewModel: Child2ViewProtocol {
var lastName: String?
init(lastName: String?) {
self.lastName = lastName
}
func getLastName() -> String {
return self.lastName ?? ""
}
}
而且我MainViewModel保留了儿童模特,所以我可以访问它们当函数saveButtonPressed被称为
class MainViewModel: MainViewProtocol {
var user: User?
var child1ViewModel: Child1ViewProtocol!
var child2ViewModel: Child2ViewProtocol!
init(child1ViewModel: Child1ViewProtocol,
child2ViewModel: Child2ViewProtocol) {
self.child1ViewModel = child1ViewModel
self.child2ViewModel = child2ViewModel
}
func getChildModel1() -> Child1ViewProtocol {
return self.child1ViewModel
}
func getChildModel2() -> Child2ViewProtocol {
return self.child2ViewModel
}
func getLanguage() -> String {
return self.user?.language ?? ""
}
func saveButtonPressed() {
self.user?.firstName = self.child1ViewModel.getFirstName()
self.user?.lastName = self.child2ViewModel.getLastName()
// And save the user for example
}
}
当您创建MainViewModel这意味着在您的协调器中,您还需要创建childViewModels并将它们注入到MainViewModel中。这也意味着您不需要在视图中对childViewModels有强烈的引用。