Swift 2.2 MVVM视图模型作为可变结构不在视图控制器

时间:2016-06-12 14:33:48

标签: ios swift mvvm value-type swift-structs

我很清楚Swift中值类型和引用类型之间的区别,并且意识到值类型被设计为不可变的用法。但结构特别有能力改变自己,这是我的担忧。如何有效地使用这些变异的struct值类型,以便它们保持状态或变化。

我的问题是,iOS应用程序MVVM设计中的应该将模型视为类还是结构?由于视图模型包含模型/模型列表,这些模型实例可能会随着时间而变化(例如,视图模型从Web服务请求获取更多模型实例并添加到其模型数组中),视图控制器的视图模型如何通过此更改进行更新。这是一个伪示例,但首先是一些注意事项和简要说明:

  • 我这里没有使用任何绑定。 (没有RxSwift)。
  • 没有KVO,我正在使用委托或完成处理程序设计。

示例:

  • 视图控制器具有视图模型的实例。当它出现时,它要求视图模型从Web服务获取数据。
  • 查看模型会触发服务,并在完成处理程序关闭
  • 中获取响应
  • 在此闭包视图模型中,将一些模型实例添加到其模型数组中。
  • 视图模型调用视图控制器的完成处理程序以通知服务请求的成功或错误。
  • 视图控制器对视图模型进行一些验证,然后相应地执行UI操作。

查看型号:

 struct DummyViewModel {

  private var ints:[Int] = []

  var count: Int {
    return ints.count
  }

  init() {}

  mutating func fetchData(completionHandler:(NSError? ) -> Void) {
    Networking.getDataFromRemote() { response in
          self.ints.append(1)
          completionHandler(nil)
    }
  }
}

查看控制器:

class DummyViewController: UIViewController{
  private var dummyViewModel: DummyViewModel?

  override func viewDidLoad() {
    super.viewDidLoad()

    /// Setup the view model
    dummyViewModel = DummyViewModel()
  }

  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    loadData()
  }
}

private extension DummyViewController {

  func loadData() {
    dummyViewModel?.fetchData { error in
        if self.dummyViewModel?.count > 0 {
          print("View model updated")
        } else {
          print("View model is still same")
        }
      }
    }
}

在上面的代码中,当视图模型获得响应时,它会将数据添加到它的数组中,但该更改永远不会传递给视图控制器,因为在闭包内部,它是视图模型的副本,而不是视图控制器的模型。那么问题是如何将此更改传递给视图控制器?

我是否应该从闭包中返回更新的视图模型实例,并在视图控制器的闭包中更新它的视图模型实例。但这也不会像在视图控制器闭包中那样工作,我也会更新视图模型的副本??

我们该如何处理?一种选择是使视图模型成为一个类,以便所有内容都是引用,并且我们在任何地方都在更新相同的实例。但是,视图模型和模型可能会发生同样的事情,模型也将成为类。我们的应用程序的主要部分是视图控制器,我们创建的视图模型和模型都是类。所以我们真的没有在这里使用价值类型的力量。

有什么建议吗?

0 个答案:

没有答案