【问题标题】:Using MVVM with a complex Model structure使用具有复杂模型结构的 MVVM
【发布时间】:2018-03-31 10:34:06
【问题描述】:

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

我的问题是我正在使用 CoreData 并且我正在尝试保存具有多个关系的单个 NSManagedObject,但是关系模型仅在连接到我的单独视图组件的其他视图模型中可用。当从我的主视图中点击保存按钮时,是否有一种干净的方法可以为我的 ViewController 拥有的主视图模型提供来自其他视图模型的关系模型。或者我是否应该考虑使用委托模式来告诉我的其他视图模型保存按钮已被点击?

【问题讨论】:

    标签: swift core-data mvvm delegates


    【解决方案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
        }
    }
    

    这意味着当您在 Coordinator 中创建 MainViewModel 时,您也需要创建 childViewModel 并将它们注入 MainViewModel。这也意味着您不需要在视图中对 childViewModel 进行强引用。

    【讨论】:

      猜你喜欢
      • 2017-05-18
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多