View Model 是否应该对 View Controller 中的事件做出反应?

Should a View Model react to events in the View Controller?

在项目的某些部分采用 ReactiveCocoa 时,我已经实施了 MVVM 范例一段时间了。我有一个关于与视图相关的对象的生命周期的简单问题。

想象一下,每当 View 从屏幕上消失时,View 模型需要更新对象中的某些内容。此更新是否应该由 ViewController 调用,或者 View 模型是否可以观察 ViewController 中的 viewWillDisappear 选择器并对其做出反应?那会是一种不好的做法吗?

您使用 MVVM 模式是为了 解耦 视图(和视图控制器,在 Cocoa 中也被认为是视图层的一部分)与模型。这意味着视图模型不应该知道任何关于视图控制器的信息。

this post 中所述,理想情况下您甚至不应该在视图模型中导入 UIKit

换句话说,视图模型应该可以重复使用以不同的方式显示相同的数据:您可能希望在视图控制器中显示数据一个普通的UIView 在其他地方的子类(考虑在 PersonTableViewCellPersonDetailsViewController 中有一个 PersonViewModel ,在点击一个单元格后显示 - 我认为这是一个很常见的场景)。

如果您以某种方式在视图模型中观察 viewWillDisappear,它与 UIViewController 个子类紧密耦合,不能与 UIView 个子类一起使用。

应按以下方式在视图控制器中调用对视图模型的更新:

- (void)viewWillDisappear:(BOOL)animated
  [super viewWillDisappear:animated];
  [self.viewModel updateStuff];
}