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
在其他地方的子类(考虑在 PersonTableViewCell
和 PersonDetailsViewController
中有一个 PersonViewModel
,在点击一个单元格后显示 - 我认为这是一个很常见的场景)。
如果您以某种方式在视图模型中观察 viewWillDisappear
,它与 UIViewController
个子类紧密耦合,不能与 UIView
个子类一起使用。
应按以下方式在视图控制器中调用对视图模型的更新:
- (void)viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
[self.viewModel updateStuff];
}
在项目的某些部分采用 ReactiveCocoa 时,我已经实施了 MVVM 范例一段时间了。我有一个关于与视图相关的对象的生命周期的简单问题。
想象一下,每当 View
从屏幕上消失时,View
模型需要更新对象中的某些内容。此更新是否应该由 ViewController
调用,或者 View
模型是否可以观察 ViewController
中的 viewWillDisappear 选择器并对其做出反应?那会是一种不好的做法吗?
您使用 MVVM 模式是为了 解耦 视图(和视图控制器,在 Cocoa 中也被认为是视图层的一部分)与模型。这意味着视图模型不应该知道任何关于视图控制器的信息。
如 this post 中所述,理想情况下您甚至不应该在视图模型中导入 UIKit
。
换句话说,视图模型应该可以重复使用以不同的方式显示相同的数据:您可能希望在视图控制器中显示数据和一个普通的UIView
在其他地方的子类(考虑在 PersonTableViewCell
和 PersonDetailsViewController
中有一个 PersonViewModel
,在点击一个单元格后显示 - 我认为这是一个很常见的场景)。
如果您以某种方式在视图模型中观察 viewWillDisappear
,它与 UIViewController
个子类紧密耦合,不能与 UIView
个子类一起使用。
应按以下方式在视图控制器中调用对视图模型的更新:
- (void)viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
[self.viewModel updateStuff];
}