MVVM With ReactiveCocoa

Posted Cocoa开发者社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVVM With ReactiveCocoa相关的知识,希望对你有一定的参考价值。



是一种软件架构模式,它是  的  的一种变体,最先由微软的架构师 John Gossman 在 2005 年提出,并应用在微软的  和  软件开发中。MVVM 衍生于  ,是对 MVC 的一种演进,它促进了 UI 代码与业务逻辑的分离。


说明:本文将采用理论与实践相结合的方式,重点介绍一个使用 MVVM 和 RAC 开发的 ios 开源项目  ,目的是希望能为你实践 MVVM 提供帮助。不过,在正式开始介绍正文之前,请你先思考以下三个问题:


  • MVC 与 MVVM 有什么异同点,MVC 到 MVVM 是怎样演进的;

  • RAC 在 MVVM 中扮演什么样的角色,MVVM 是否一定要结合 RAC 使用;

  • 如何将一个现有的 MVC 应用转变成一个 MVVM 应用,有哪些需要注意的地方。


带着以上问题,我们一起进入正文。


名词解释:本文中的 RAC 为 ReactiveCocoa 的缩写。


MVC


MVC 是 iOS 开发中使用最普遍的架构模式,同时也是苹果官方推荐的架构模式。MVC 代表的是 Model–view–controller ,它们之间的关系如下:

是的,MVC 看上去棒极了,model 代表数据,view 代表 UI ,而 controller 则负责协调它们两者之间的关系。然而,尽管从技术上看 view 和 controller 是相互独立的,但事实上它们几乎总是结对出现,一个 view 只能与一个 controller 进行匹配,反之亦然。既然如此,那我们为何不将它们看作一个整体呢:

MVVM With ReactiveCocoa

因此,M-VC 可能是对 iOS 中的 MVC 模式更为准确的解读。在一个典型的 MVC 应用中,controller 由于承载了过多的逻辑,往往会变得臃肿不堪,所以 MVC 也经常被人调侃成 Massive View Controller :


iOS architecture, where MVC stands for Massive View Controller.


坦白说,有一部分逻辑确实是属于 controller 的,但是也有一部分逻辑是不应该被放置在 controller 中的。比如,将 model 中的 NSDate 转换成 view 可以展示的 NSString 等。在 MVVM 中,我们将这些逻辑统称为展示逻辑。


MVVM


因此,一种可以很好地解决 Massive View Controller 问题的办法就是将 controller 中的展示逻辑抽取出来,放置到一个专门的地方,而这个地方就是 viewModel 。其实,我们只要在上图中的 M-VC 之间放入 VM ,就可以得到 MVVM 模式的结构图:

MVVM With ReactiveCocoa

从上图中,我们可以非常清楚地看到 MVVM 中四个组件之间的关系。注:除了 view 、viewModel 和 model 之外,MVVM 中还有一个非常重要的隐含组件 binder :


  • view :由 MVC 中的 view 和 controller 组成,负责 UI 的展示,绑定 viewModel 中的属性,触发 viewModel 中的命令;

  • viewModel :从 MVC 的 controller 中抽取出来的展示逻辑,负责从 model 中获取 view 所需的数据,转换成 view 可以展示的数据,并暴露公开的属性和命令供 view 进行绑定;

  • model :与 MVC 中的 model 一致,包括数据模型、访问数据库的操作和网络请求等;

  • binder :在 MVVM 中,声明式的数据和命令绑定是一个隐含的约定,它可以让开发者非常方便地实现 view 和 viewModel 的同步,避免编写大量繁杂的样板化代码。在微软的 MVVM 实现中,使用的是一种被称为  的标记语言。


ReactiveCocoa


尽管,在 iOS 开发中,系统并没有提供类似的框架可以让我们方便地实现 binder 功能,不过,值得庆幸的是,GitHub 开源的 RAC ,给了我们一个非常不错的选择。


RAC 是一个 iOS 中的函数式响应式编程框架,它受  的启发,是  和  在开发  过程中的一个副产品,它提供了一系列用来组合和转换值流的 API 。如需了解更多关于 RAC 的信息,可以阅读我的上一篇文章《》。


在 iOS 的 MVVM 实现中,我们可以使用 RAC 来在 view 和 viewModel 之间充当 binder 的角色,优雅地实现两者之间的同步。此外,我们还可以把 RAC 用在 model 层,使用 Signal 来代表异步的数据获取操作,比如读取文件、访问数据库和网络请求等。说明,RAC 的后一个应用场景是与 MVVM 无关的,也就是说,我们同样可以在 MVC 的 model 层这么用。


小结


综上所述,我们只要将 MVC 中的 controller 中的展示逻辑抽取出来,放置到 viewModel 中,然后通过一定的技术手段,比如 RAC 来同步 view 和 viewModel ,就完成了 MVC 到 MVVM 的转变。


Talk is cheap. Show me the code.


下面,我们直接上代码,一起来看一个 MVC 模式转换成 MVVM 模式的示例。首先是 model 层的代码 Person :


@interface Person : NSObject

以上是关于MVVM With ReactiveCocoa的主要内容,如果未能解决你的问题,请参考以下文章

MVVM with ReactiveCocoa

[HMLY]14.ReactiveCocoa 和 MVVM 入门

浅谈ReactiveCocoa之MVVM

ReactiveCocoa常见操作方法介绍/MVVM架构思想

MVVM without ReactiveCocoa

iOS 之ReactiveCocoa