谁应该在iOS MVVM中创建ViewModel?

时间:2015-04-07 23:16:12

标签: ios objective-c mvvm

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

View in different class MVVM

在此示例中,视图不是ViewController本身,它是一个包含view的所有详细信息的类,它是VC的抽象。 ViewController创建ViewModel,其中包含从DB,Network中检索的一些数据。 ViewControllermodel对话并管理ViewModel以更新view

ViewController is the view MVVM

在此示例中,viewController是视图,它不需要其他类。 viewModel不是由viewController创建的,而下一个ViewModel的{​​{1}}是由ViewController创建的。 ViewModel也有ViewModel的实例,所以如果它需要检索一些数据,它就有DB,Network的实例。 我不太了解一些事情。如果Model正在使用异步任务从Network检索数据,并且我想显示一个微调器并获取数据以实现视图。我应该使用viewModelblocks还是KVO?如果我使用delegates,那么delegates实现view方法会是正确的吗?我将ViewModelDelegateview联系起来了吗?我在这一点上很困惑。

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

我还有一个关于firstViewController创作的问题。 ViewController是下一个ViewControllers创建的参与者吗?如果我创建一个管理ViewControllers创建和导航的对象,我是否应该通过ViewControllers传递此对象?

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

我还没有使用MVVM,因为我想先了解这种模式。虽然它在我的TO-DO列表中。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

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

在我看来,要么是合理的。您甚至可能在一个应用程序中有多个需求。因此,我保持灵活性。我的方法是在VC 的viewDidLoad()方法中创建VM,只有它还不存在。这允许我使用我的普通虚拟机并在我的VC中创建它(整齐地),但如果我需要覆盖它(单元测试,UI测试,备用视图样式),我也可以。

答案 1 :(得分:0)

问题来自Cocoa应用程序,根据定义使用MVC,你必须尝试使MVVM与底层的ViewController结构一起工作。

我还没有看过iOS中的MVVM,但是使用了Xamarin.Forms,其中View只是XAML代码,视图模型与View和Model交互。在Cocoa应用程序中,如何处理ViewModel部分并不重要,但是看看你的链接,我认为第二种方法更接近于更纯粹的MVVM方法。

我建议您下载链接中的代码并查看以获得更好的理解?