【问题标题】:Who should create the ViewModel in iOS MVVM?谁应该在 iOS MVVM 中创建 ViewModel?
【发布时间】:2015-04-07 23:16:12
【问题描述】:

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

View in different class MVVM

在这个例子中,视图不是ViewController 本身,它是一个包含view 的所有细节的类,它是VC 的抽象。 ViewController 使用从数据库、网络检索的一些数据创建 ViewModelViewControllermodel 对话并管理ViewModel 以更新view

ViewController is the view MVVM

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

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

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

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

我还没有使用Reactive Cocoa,因为我想先很好地理解这个模式。虽然它在我的 TO-DO 列表中。

谢谢!

【问题讨论】:

    标签: ios objective-c mvvm


    【解决方案1】:

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

    首先,您可能正在使用 MVVM,因为您希望以一种将逻辑从 VC 中提取出来并保持干净的方式来组织代码。在这种情况下,您正在使用具有良好 OOP 形式的 ViewModel,并且完全可以让 VC 创建它。

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

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

    【讨论】:

      【解决方案2】:

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

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

      我建议你下载链接中的代码,看看有没有更深入的了解?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-18
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 2011-04-09
        • 1970-01-01
        相关资源
        最近更新 更多