ios - 谁应该在 iOS MVVM 中创建 ViewModel?

标签 ios objective-c mvvm

我正在尝试开发一个简单的应用程序来理解 MVVM 但我不太了解它。我读过一些文章,但它们有点不同:

View in different class MVVM

在此示例中, View 不是 ViewController 本身,它是一个包含 view 所有细节的类,并且是 的抽象VCViewController 创建 ViewModel 并使用它从数据库、网络检索的一些数据...... ViewControllermodel 对话并管理 ViewModel 以更新 view

ViewController is the view MVVM

在这个例子中,viewController 就是 View ,它不需要其他类。 viewModel 不是由 viewController 创建的,下一个 ViewControllerViewModel 是由 ViewModel 创建的。 ViewModel 也有一个 Model 的实例,所以如果它需要检索一些数据,它有 DB、Network.. 有些东西我不是很明白。如果 viewModel 正在使用异步任务从网络中检索数据,并且我想显示一个微调器并获取数据以实现 View 。我应该使用 blocksKVO 还是 delegates?如果我使用 delegatesview 实现 ViewModelDelegate 方法,这样对吗?我是否将 viewviewModel 相结合?我现在很困惑。

如果我有一个 firstViewModel 为新推送的 SecondViewController 创建一个新的 secondViewModel,并且 FirstViewController 有在用户弹出推送的 SecondViewController 之前更新其 View 。在这种情况下,firstViewModel 必须观察 secondViewModel 并在弹出后通知 firstViewController 的更改,不是吗?

我还有一个关于 ViewController 创建的问题。 ViewControllers 是下一个 ViewControllers 创建的服务员吗?如果我创建一个管理 ViewControllers 创建和导航的对象,我应该将这个对象传递给 viewModels 吗?

我知道它们非常相似,但我对应该采用哪种方式以及如何实现感到困惑。关于 iOS MVVM 的信息和例子不多。

我还没有使用 Reactive Cocoa 因为我想先很好地理解这个模式。尽管它在我的待办事项列表中。

谢谢!

最佳答案

这实际上取决于您使用 MVVM 的原因。实际上,我是在你提到的两个案例中间做的。以下是使用 MVVM 的两个原因:

首先,您可能正在使用 MVVM,因为您希望以一种将逻辑从 VC 中拉出并保持其清洁的方式来组织代码。在这种情况下,您使用的是良好的 OOP 形式的 ViewModel,并且非常适合让 VC 创建它。

另一方面,您可能打算对您的 VC 进行 UI 测试,因此想要引入模拟 ViewModel。在这种情况下,您希望将 ViewModel 交给 VC。 (即依赖注入(inject))

在我看来,两者都有道理。您甚至可能在一个应用程序中有多种需求。因此,我保持灵 active 。我的方法是在 VC 的 viewDidLoad() 方法中创建 VM only if 它尚不存在。这允许我使用我的普通 VM 并在我的 VC 中(巧妙地)创建它,但如果我需要覆盖它(单元测试、UI 测试、替代 View 样式),我也可以。

关于ios - 谁应该在 iOS MVVM 中创建 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29503067/

相关文章:

ios - 如何从 TableView 中删除 Firebase 中的节点

ios - 复制时如何使用 [NSFileManager defaultManager] 覆盖文件夹?

添加时 C# datagrid 不会更新 itemsource

wpf - 将输入文本框设为货币格式 (WPF MVVM)

objective-c - 将 View 添加到 ScrollView

ios - UITextField shouldChangeCharactersInRange

ios - UITableViewCell - 每个部分勾选一行

wpf - 为什么这个 wpf 数据绑定(bind)失败

ios - Flutter/FCM 通知未到达 Codemagic iOS 版本

iphone - iOS应用程序中已下载文件的磁盘空间