MVC's Blind Structure Way

来源:互联网 发布:java版qq是什么意思 编辑:程序博客网 时间:2024/05/27 20:17

前几天看斯坦福大学iOS公开课,讲到”blind way”的时候,旁边不是做开发的弟弟问了一句,”blind way”是接收方已经确定了,然后可以随便发,不管怎样接收方都能收到消息?我说”blind way”应该是:我不管接收方是谁,我只管发消息就可以了.然后我们就开始了一场语义理解和开发理解的讨论,最终我也没能拿出充分的理由说服弟弟,好羞愧⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ ! 现在特意做了一些功课和大家分享.

MVC 基本概念

Model: What your application is (but not how it is displayed)
Controller: How your Model is presented to the user (UI logic)
View: Your controller’s minions (下属)

View是控制器要使用的类,用于构建UI,所以视图中的东西一般是一些通用的UI元素.而控制器仅仅是用来指定UI是怎么工作的.模型又完全独立于UI的工作.所以要正确的使用MVC就要知道程序是怎么运行的,而且还需要知道这三块之间如何通信.

这里写图片描述

MVC 如何通信

Controllers到Model的通信

Controllers can always talk directly to the Model. 控制器可以毫无障碍的和Model通信,因为控制器的功能就是使用View来将模型呈现给用户.

Controllers到View的通信

Controllers can always talk directly to their View. 控制器也可以毫无障碍的和View通信,上面说过View是Controller的下属,所以控制器当然可以随意使唤自己的View了.

注: outlet: Controller的一个指向View的属性.这个属性可以让Controller和View之间进行通信.(就是拖线拖出来的那个)

Model到View之间的通信

那么从Model到View的通信捏? Never!!! Model是完全独立于UI的! 所以绝对不能同视图这一块的对象进行通信!因为View的objects一般是通用的(这里的”一般”只是客气的语气而已). 其本质上就是UI的objects. 也正是因为View的objects是通用的,所以View无法同任意特定模型进行通信.View需要控制器来为自己解释Model.

View到Controllers的通信

对于一些通用的View objects.比如按钮什么的能和控制器通信吗? 答案是可以的,但是需要谨慎,因为View objects”一般”是通用的,所以他们不能对Controllers知道的太多.所以View能以一种”blind way”(“盲”)的方式和Controllers进行通信. View不知道通信的另一方的类. 这里需要一种结构化的方式,也就是说我们都同意这样的方式,比如说 Target Action: 控制器在自身身上设置一个Target.这个target会提供一个动作,就像一支箭射到View身上,然后跟View说:当你要做什么时(比如有人按了你,或者有人动了你)给我发个action.所以以这种方式,通用的按钮之类的东西就能往回给控制器通信.但它不知道具体是哪个控制器,它只知道自身发生了什么,然后将消息发给target.这是一种盲目的,简单的,结构化的方式来让View 能够和控制器通信. 更复杂的方式捏? 有时候View中发生的情况比较复杂一些,而控制器又需要同步的知道View中正在发生什么. 比如: will, should, did,以scrollView为例,当view在滚动时,我想要控制器知道用户刚刚”did”滚动过了,或者当用户按着这里准备滚动的时候,我想要控制器知道用户”will”滚动.或者当用户触碰的时候,scrollView想要知道,我允许用户滚动吗.对于所有的这些问题,scrollView自身都没有足够的逻辑去知道答案,所有我不知道的就交给别人去做吧,然后它就将回答这些问题的权利delegate了其他对象.但是它并不知道这个对象的类,它只知道这种对象能够回答这些问题.

注: 协议是两种对象之间进行”blind way”的通讯方式.

view不持有数据.
DataSource: 数据也不会考虑 will, should, did问题, 它的主要职责是处理诸如 计数,数据之类的问题. 也是以”blind way”的方式提供给View.这就是View通过控制器从模型获取数据的方式. blind structure way. DataSource其实是一种delegate.是一类用于获取数据的特殊delegate.

所以控制器的工作是为view解释并格式化所提供的数据模型.

Model到Controller的通信

那么从模型到控制器的通信呢? NO! 因为模型对UI一无所知.所以它不能同控制器这样的UI对象进行通信.但是模型中的东西会发生改变,控制器需要知道它的改变,比如说数据变化,数据库变化或者模型是某种来自网络的数据库.当网络上的数据改变了,控制器需要知道这些改变 ..模型会使用通知来广播信息给任何感兴趣的人,iOS中执行这一功能的就是通知和KVO.
模型中的任何东西发送改变的时候,Model会通过广播广播信息.然后控制器收到来自通知的信息时,他会通过绿色的箭头和Model进行通信,让模型把变化了的数据给它.

View能否接受Model的通知? 也许能,但是最好不要这样做,因为这违反MVC,

MVC组

MVC能将另一个MVC作为其视图的一部分

这里写图片描述

0 0