MVVM& iOS - 缺失规则

时间:2017-11-05 13:29:24

标签: ios mvvm

我现在和MVVM以及Swift一起工作了一段时间。原理很简单:

  1. ViewController 负责 查看;
  2. ViewModel 负责 模型;
  3. ViewController 拥有 查看;
  4. ViewController 拥有 ViewModel ;
  5. ViewModel 拥有 模型;
  6. 期。

    对我来说很清楚。但是我仍然有一些问题(它们可能听起来很愚蠢,但对新手来说,与上述规则一样清楚很重要):

    1. ViewModel应该对业务逻辑负责吗?我的意思是,由于ViewController不拥有模型,因此将业务逻辑放在ViewModel中是正确的;
    2. ViewModel应该是struct吗?这是一个棘手的问题。我猜测ViewModel也应该为ViewController提供一个与数据交互的API。因此,有时我们需要使用一些 escaping closures 来获取异步数据(例如HTTP调用)。结构无法控制它。
    3. 我应该从ViewController中隐藏非出口变量吗?有时我们需要对某些属性进行强引用才能显示视图(例如,保留UIPageControl的当前页面)。 ViewController应该持有这个引用吗?
    4. 如何从ViewModel中激活ViewController更新?我确实读过reactive programming,但我的问题更广泛:有时候ViewModel需要ViewController来响应某些动作,这是最好的方法去做吧? ViewModel应该对ViewController可以处理的特定反应保持特定的回调吗?我遇到Srdan Rasic's post关于"绑定"属性和我感到困惑(也许它与这个问题根本没有关系)。
    5. 如果你们能分享你们的解决方案,我会很高兴的。谢谢!

1 个答案:

答案 0 :(得分:1)

你的问题非常广泛。有人肯定会比我更广泛地解释它,或者可能有不同的意见。但这些是我的观察:

1。是ViewModel应该是处理业务逻辑的唯一组件

2。我猜你自己回答了,它应该是class。我没有任何理由说明原因struct。但是,如果符合您的需求,我可以说。

3. 取决于使用情况。如果你将它用于视图的目的,那么可以在这里使用它。对于较小的部件,还存在一个单独的ViewModel的概念,遗憾的是,不知道名称。我的意思是你有一个用于整个视图的主ViewModel和用于子视图的subViewModel。因此,您最终不会在ViewModel中拥有大量代码。有时它也是可接受的技术债务(希望不会因为这样说而杀了我)

4。就是这样。您将按此按钮,您将调用名为ViewModel的{​​{1}}中的方法(或触发事件)。然后你的buttonPressed将完成它的工作,可能会获得一个新数据并为此设置视图。从我所看到的情况来看,您可以通过在ViewModel中对View进行弱引用,或在视图中绑定反应属性来实现。第二个选项不需要在ViewModel中使用View,但您必须为ViewModel的每个视图设置属性注册观察者。