对iOS中MVC的理解

时间:2022-03-03 21:37:09

对iOS中MVC的理解

总结于斯坦福大学的白头发老头的公开课

模型-控制器-视图(MVC)是一种将应用中给所有类组织起来的策略

模型(Model)实际上考虑的是“什么”的问题,即你的程序是什么?

  以纸牌匹配游戏为例子,模型就是设计这个游戏怎么玩,花色匹配,数值匹配得多少分,等逻辑问题。以及这个游戏里的类,如:纸牌,牌堆等类都属于模型里面的东西。以上都是独立于UI且在模型中的。

  至于纸牌如何抽取到屏幕上是控制器的工作

控制器(Controller)控制模型如何呈现在屏幕上,即弄清如何将这些牌显示在屏幕上,然后将其用动画的形式表现。

视图(View)是控制器的侍从,是控制器要使用的类,用于构建UI

这三者之间如何通信?如图

对iOS中MVC的理解

Controller要完全知道Model的内容,不受限制地访问Model

上面说到View是Controller的侍从,所以Controller也能与View通信,如通过outlet;

相反View也能与Controller通信,但是View是通用的,所以它不能对Controller的类知道得太多,只能以一种“盲”的方式去通信,如关联一个action(点击按钮,移动滑动条),View会发送消息给Controller说自己“被碰了”,它不知道这个Controller是一个什么控制器,纸牌游戏控制器?其他游戏的控制器?这是一种盲的,简单的,结构化的方式,让视图能够与控制器通信。

还有一种较为复杂的方式,就是通过委托(delegate)协议(will,should,did等方法)来通信,协议是一种同另一对象通信的盲方式。

对iOS中MVC的理解

还有重要的一点,视图不拥有他们所显示的数据,它通过数据源(data Source)与Controller通信来从Model获得这些数据并显示。

对iOS中MVC的理解

Controller能与Model通信,相反呢?当Model里的事物变化,如数据,数据库,网络数据库,有人修改了网络的内容,Controller需要知道,Model怎么告诉它呢?

答案就是通过监听(KVO),Controller通过监听Model,当Model发生变化,它会以广播的方式发送消息给对它有兴趣的Controller,监听它的Controller就得知它发生了什么变化了。

对iOS中MVC的理解