上篇写的一个View对应着一个ViewContorller
情景二:多个View对应一个ViewContorller
这里还是用发帖子做例子:
发布的帖子类型可能有多种:搞笑类、文学类、短文类、日记类、交友类、活动类等
这种情况下,显然一个类型建立一个ViewContorller是不实际的,多余文件增加app体积不说,重复多余代码毫无效率。
那么还是用MVC框架来实现
将每个Model里都共用的方法与属性提取出来,建立一个胖Model
/*——————————————————————————————————— • 什么叫胖Model? 胖Model包含了部分弱业务逻辑。胖Model要达到的目的是,Controller从胖Model这里拿到数据之后,不用额外做操作或者只要做非常少的操作,就能够将数据直接应用在View上 ———————————————————————————————————-*/
胖Model中含有一些重复出现频率很高的业务,有很高的复用性,如果这部分写在别的地方,一旦弱业务有修改,就会改很多处地方。把一些弱业务交给胖Model做,从而给Controller瘦身,Controller只需要关注强业务代码就行了,很好的解决的上面的问题。
然后每个分类对应一个Model以及View,这里的每个Model是负责每一个View上面的业务数据表达,也就是常说的瘦Model。
/*——————————————————————————————————— • 什么叫瘦Model? 瘦Model只负责业务数据的表达,所有业务无论强弱一律扔到Controller。瘦Model要达到的目的是,尽一切可能去编写细粒度Model,然后配套各种helper类或方法来对弱业务做抽象,强业务依旧交给Controller。 ———————————————————————————————————-*/
View要和VC进行交互的,也就是数据的输入与输出,每一个View有相同的功能(选择发送照片,地理信息定位等),但是也有不同的(每个View的信息输入源数量不同,有的2个TextField,有的可能有6个等)。
所以,将每个View共同有的功能放入ViewController 内,每个View自己独有的功能则写在View本身。View中的数据通信直接与Model进行,VC与Model的数据通信在iOS中有很多种来实现:KVO、Notification、block、delegate和target-actiond ,这里就不做过多的描述。
根据上面的铺垫,分层模型基本搭建完成了,这里要说的呢是分层模型对协作开发的好处,因为上面已经根据业务类型分解给了View和ViewController,所以这两块业务上互不相干可以由两个人同时进行,分工更明确,开发效率更高。
首先做View-Model的人可以根据业务类型定义两个协议:
(ModelProtocol和ViewProtocol)
ModelProtocol:负责和模型相关的一些业务(例如:数值的有效性,以及数值的对外传递)
ViewProtocol:负责View的一些业务(刷新View布局、回收键盘)
和做ViewController的人商量好对外开放的方法名称即可,ViewController只需在对应的地方调用需要调用的protocol中含有的方法得到想要的数据或者效果即可,不必关心View和Model中做了哪些事情,而View-Model的人不必需要VC中有哪些业务逻辑,只需要在自己负责的View-Model层完成对应的协议方法业务即可。
多个View对应着一个ViewController,在ViewController中难免会遇见判断代码块,过多的判断代码块会使代码整体非常的难看,应该减少判断次数:
因为每个类型界面都会涉及到Model与VC的通信、View与VC的通信,以及VC对Model的数据输入,
所以利用成员变量 全局性分别建立
id<ModelProtocol>_delegateModelProtocol; //代替Model中的代理 id<ViewProtocol>_delegateViewProtocol; //代替View中的代理 PostModel * _postModel; //代替View.model
这里只需要在界面的初始化判断一次,并在初始化后将对应的数据进行成员变量赋值即可 _delegateViewProtocol = _ funnyPostView;
_delegateModelProtocol = _ funnyPostView.consultingModel; _postModel = _ funnyPostView. funnyModel;
在后面,VC的交互只需要对_postModel进行数据交互,在对应的地方分别调用_delegateViewProtocol、以及_delegateModelProtocol 的方法就行:
例如:
[_delegateViewProtocol getTheUserInput]; [_delegateModelProtocol isDataAvailable];
到这里差不多就写完了,感觉比较抽象,不太好上代码块,所以只是说一了一下逻辑上的东西,以及这次迭代工作中与同事协作开发的的一些心得体会。
参考资料:
http://mdsa.51cto.com/art/201505/477731_3.htm