2017-10-19 175 views
0

所以我使用MVVM架构和我已经构建了一个相当复杂的视图,所以我决定将视图分成不同的类,然后使用不同的视图模型为每个分离查看组件。我也使用协调器(所以MVVMC基本上),我使用协调员来设置我的视图控制器,然后创建视图模型并将其注入单独的视图组件,通过我的主视图中的IBOutlets可以访问这些组件。使用MVVM与一个复杂的模型结构

我的问题是,我正在使用CoreData,我试图保存一个具有多个关系的NSManagedObject,但是关系模型仅在我的其他视图模型中可用,这些模型连接到我的单独视图组件。有没有一种干净的方式,当我的主视图中点击保存按钮时,我可以给我的ViewController拥有的主视图模型和其他视图模型的关系模型。或者我应该考虑使用委托模式,告诉我的其他视图模型保存按钮被点击了?

回答

1

所以我认为有几种可能性。以下是我如何管理几乎类似的情况,我希望它能帮助你进行思考。

首先我为我的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有强烈的引用。