【长篇高能】ReactiveCocoa 和 MVVM 入门

05-26 18:18:05   来源: 苹果开发中文站    评论: 点击:

翻译自 ReactiveCocoa and MVVM, an Introduction 文中引用的 Gist 可能无法显示。为了和谐社会, 请科学上网。MVC 任何一个正经开发过一阵子软件的人都熟悉MVC,它意思是 Model View Controller , 是一个在复

翻译自 ReactiveCocoa and MVVM, an Introduction . 文中引用的 Gist 可能无法显示。为了和谐社会, 请科学上网。

MVC

任何一个正经开发过一阵子软件的人都熟悉MVC,它意思是 Model View Controller , 是一个在复杂应用设计中组织代码的公认模式. 它也被证实在 iOS 开发中有着第二种含义:  Massive View Controller(重量级视图控制器) 。它让许多程序员绞尽脑汁如何去使代码被解耦和组织地让人满意. 总的来说, iOS 开发者已经得出结论: 他们需要 给视图控制器瘦身 , 并进一步分离事物;但该怎么做呢?

MVVM

于是 MVVM 流行起来, 它代表 Model View View-Model , 它在这帮助我们创建更易处理, 更佳设计的代码.

在有些情况违背苹果建议的编码方式不是很能讲得通。我不是说不赞成这样子, 我指的是可能会弊大于利。比如我不建议你去实现个自己的 view controller 基类并试着自己处理视图生命周期.

带着这种情绪, 我想提个问题: 使用除苹果推荐的 MVC 之外的应用设计模式是愚蠢的么?

不,有两个原因。

  1. 苹果没有为解决重量级试图控制器问题提供真正的指导. 他们留给我们来解决如何向代码添加更多清晰的思路. 用 MVVM 来实现这个目的想必是极好哒. (在今年 WWDC 的一些视频中, 苹果工程师在屏幕上的示例代码的确少许出现了 view-model, 不知道是否因为有它才成为了示例代码)

  2. MVVM, 至少是我将要在这里展示的 MVVM 的风格, 都跟 MVC 十分兼容. 仿佛我们将 MVC 进行到下一个逻辑步骤.

我不会提及 MVC/MVVM 的历史, 因为其他地方已经有所介绍, 并且我也不精通. 我将会关注如何用它进行 iOS/Mac 开发.

定义 MVVM

  1. Model - model在 MVVM 中没有真正的变化. 取决于你的偏好, 你的 model 可能会或可能不会封装一些额外的业务逻辑工作. 我更倾向于把它当做一个容纳表现数据-模型对象信息的结构体, 并在一个单独的管理类中维护的创建/管理模型的统一逻辑。

  2. View - view 包含实际 UI 本身(不论是 UIView 代码, storyboard 和 xib), 任何视图特定的逻辑, 和对用户输入的反馈. 在 iOS 中这不仅需要 UIView 代码和那些文件, 还包括很多需由 UIViewController 处理的工作。

  3. View-Model 这个术语本身会带来困惑, 因为它混搭了两个我们已知的术语, 但却是完全不同的东东. 它不是传统数据-模型结构中模型的意思(又来了, 只是我喜欢这个例子). 它的职责之一就是作为一个表现视图显示自身所需数据的静态模型;但它也有收集, 解释和转换那些数据的责任. 这留给了 view (controller) 一个更加清晰明确的任务: 呈现由 view-model 提供的数据。

关于 view-model 的更多内容

view-model一词的确不能充分表达我们的意图. 一个更好的术语可能是 “View Coordinator”(感谢 Dave Lee 提的这个 “View Coordinator” 术语, 真是个好点子)。你可以认为它就像是电视新闻主播背后的研究人员和作家团队。它从必要的资源(数据库, 网络服务调用, 等)中获取原始数据, 运用逻辑, 并处理成 view (controller) 的展示数据. 它(通常通过属性)暴露给视图控制器需要知道的仅关于显示视图工作的信息(理想地你不会暴漏你的 data-model 对象)。 它还负责对上游数据的修改(比如更新模型/数据库, API POST 调用)。

MVC 世界中的 MVVM

我认为 MVVM 这个首字母缩写如同 view-model 术语一样, 对如何使用它们进行 iOS 开发体现得有点不太准确. 让我们再检查下这个首字母缩写, 了解下它是怎么与 MVC 融为一体的。

为了图解表示, 我们颠倒了 MVC 中的 V 和 C , 于是首字母缩写更能准确地反映出组件间的关系方位, 给我们带来  MCV . 我也会对  MVVM  这么干, 将 V(iew) 移到 VM 的右边最终成为了  MVMV . (我相信这些首字母缩写起初不排成这样更合理的顺序是有原因的。)

这是这两种模式如何在 iOS 中组装在一起的简单映射:

  • 我试图遵循区块尺寸(非常)大致对应它们负责的工作量。

  • 注意到视图控制器有多大 ?

  • 你可以看到我们巨大的视图控制器和 view-model 之间有大块工作上的重合。

  • 你也可以看看视图控制器在 MVVM 中的足迹有多大一部分是跟视图重合的。

你大可安心获知我们并没有真的去除视图控制器的概念或抛弃 “controller” 术语来匹配 MVVM。 (唷. )我们正要将重合的那块工作剥离到 view-model 中, 并让视图控制器的生活更加简单。

我们实际上最终以 MVMCV  告终.  Model View-Model Controller View . 我确信我无拘无束的应用设计模式骇客行为会让人大吃一惊。

我们的结果:


相关热词搜索:ReactiveCocoa MVVM

上一篇:Shadowsocks 使用方法及资料汇总 下一篇:如何创造一个吸引眼球的应用图标?
分享到: 收藏