本文翻译自MVVM Tutorial with ReactiveCocoa
你也许在Twitter上看过这么一则笑话"iOS Architecture,where MVC stands for Massive View Controller".
这是关于iOS开发者的笑话,然而你在开发的过程中也会遇到这样的问题:厚重且难以维护的view controller.
本文将讨论应用的另一种架构Model-View-ViewModel(MVVM).得益于ReactiveCocoa,MVVM提供了MVC的可替代类型来减轻view controllers.
通过本文的教程,你将编写一个简单的Flickr搜索app,如下图所示:
编写之前,先来脑补些基础知识!
-
ReactiveCocoa简介
本文主要讲解MVVM,而且假定你已经对ReactiveCocoa有所了解.如果你还没用过ReactiveCocoa,那么推荐你看看以前的教程来了解下.
如果你想要复习下ReactiveCocoa的知识,我来小小总结一下.
ReactiveCocoa的核心为signals即RACSignal类.Signals发出三种类型的事件流:next、completed、和error.
通过此模式,ReactiveCocoa可以用来替代delegate、target-action、key-value observing等模式.
通过signal API创建的代码更加统一且易读.但ReactiveCocoa真正强大之处在于通过这些信号源能进行更多高级操作.这些操作能在相当简洁高雅的操作下执行复杂的筛选、转换、信号协调等.
在MVVM中,ReactiveCocoa扮演着重要角色.它提供ViewModel和View之间的绑定操作. -
MVVM介绍
Model-View-ViewModel(MVVM)设计模式通俗讲,是个UI设计模型.它是MV设计模式大家庭中的一员,MV模式还包括Model View Controller(MVC)和Model View Presenter等等.
这些模式的业务逻辑和UI逻辑相分离,以使程序易于开发和测试.
为了更好地理解MVVM,需要来了解下它的先辈.
MVC为首个UI设计模式,可以追随到Smalltalk language of the 1970s.下图展示了MVC模型的元素及结构:
此模式将UI分割成Model(用来代表程序的状态)与View(UI控件)和Controller(用来处理用户交互以及更新model模型)
MVC很大的一个问题是它相当混乱.概念听起来很好,但当人们实现它时,Model、View、Controller之间看似圆形的关系,却很容易混为一坛,造成换乱.
最近Martin Fowler介绍了MVC模型的演变Presentation Model,并通过微软来推广和使用MVVM. MVVMPattern.png
这种模型的核心为ViewModel:用来呈现应用UI状态的model的一种.
它包含UI控件的属性状态.例如当前text field里面的输入内容、一个特殊的按钮是否能用.而且还能提供view上的交互动作,例如按钮的点击和手势.
ViewModel可以理解为model-of-the-view.
MVVM的三个组件之间的关系同MVC相似,遵从以下准则:
- View有一个ViewModel的引用,不可逆转.
2 ViewModel有一个相应的Model引用,不可逆转.
如果你不遵从以上准则,将在使用MVVM时出错.
这种设计模式有以下两个优点:
- 轻Views:你的UI逻辑都在ViewModel里从而使view变得很轻.
- 测试:你能够在没有View的情况下运行程序,大大增强了可测试性.
这里你也许会有个疑问.如果View有个对应的ViewModel但却不可逆转,那么ViewModel如何来更新View呢?
哈哈哈!这就是MVVM模型的所要解决的问题.
Girl学iOS100天 第16天
网友评论