iOS的函数响应型编程

终稿

MVVM是一个非常有趣的架构。在这方面我思考的越多,它对我的意义便越大。诚然,本章中的视图模型所呈现的业务逻辑都很轻量。我已经把它们上传到Github仓库里了,但是本章作为一个MVVM的示例为初学者的开始提供了参考。

我想提供一个具体的例子来说明它比MVC更有竞争力,更具意义。

最近我创建的一个App中,我们有一堆数据,支持下拉刷新,每一个元素点击之后会推出详情页面,视图控制器有很多业务逻辑,非常标准的东西。然而,这一堆数据彼此之间来路是不一样的,有的是主API入口的数据结果,有的是它们的搜索结果,有的是App在编译时就决定的静态元素。

使用MVC的话,我想到了两种方法来解决:

  1. 在臃肿的视图控制器中创建一个类处理显示,并管理所有的数据内容
  2. 毫无疑问,另一种方法就是子类化一个视图控制器的抽象基类来包含所有内容的通用逻辑。

这是过去我所采用的方式,但这方式很难重构,比方说:有些所有类型的通用内容变得只对部分类型有效时。这同样也能被称为是一种黑客攻击,因为Objective-C不支持抽象类。

我采用的方法是使用符合该视图控制器所依赖的协议的不同的视图模型。通过将定制的业务逻辑放置于视图模型中,我避免了视图控制器的臃肿化,视图控制器仅需要根据视图模型的协议来知道如何显示即可。 MVVM是子类化视图控制器的一个很好的选择。

另外,如果你有多平台需求(比如说:iOS & OSX),他们可以共用一套视图模型,因为他们不牵扯到视图本身的逻辑。你甚至可以走得更远,用另外的语言来生成视图模型,然后生成指定的语言的视图模型对象比如:Objective-C、C#、Ruby、Java或者其他你需要的任何语言。疯狂吧这玩意~

最后,我们并没有真正地涉及到RACCommand的使用。我将利用Justin Spahr-Summers的说法在MVVM的范畴来解释它。

  1. 控制(事件)与它交互
  2. 一个属于视图模型的命令被执行
  3. 视图模型的逻辑被运行(运行的是命令初始化时的signalBlock)
  4. 视图模型通过ReactiveCocoa来间接通知视图。在我们的例程中,视图会被更新。

再一次强调Github仓库包含了我们在本书中没有能够涉及的,关于RACCommand的,使用的详细信息。去看一看吧!

MVVM效果很好,与ReactiveCocoa结合起来使用更好。你没有必要一下子就被它“招安”了。你可以从小处着手,先在一个视图控制器中使用,看看你到底能有多喜欢它。在你的下一个项目中尝试使用它把,你会看到它如何彻底简化你的视图控制器的复杂度。