iOS高级关注移动开发技术前沿

MYDay-第1期-Introduction to MVC-MV

2016-09-27  本文已影响267人  Z_Han

Preface


首先,感谢一下老师和朋友们对我一直以来的支持以及宽容。最近,我所实习的公司开办了一个名为 MY Day 的内部技术分享活动,作为活动的组织者之一及第一期的分享嘉宾,我倍感荣幸,但同时也压力山大。考虑到公司新来实习的同学们基础不同,思来想去,第一期还是分享一些基础的知识,目的是参与的人能够听懂,并提出一些比较好的问题,希望起到抛砖引玉的作用。内容不新鲜,希望大家批评指正,多多包容,感谢!

What is MVC


MVC全称是Model View Controller,是模型 (model)-视图 (view)-控制器 (controller) 的缩写。它表示的是一种常见的客户端软件开发框架。MVC 的概念最早出现在二十世纪八十年代的 施乐帕克 实验室中(对,就是那个发明图形用户界面和鼠标的实验室),当时施乐帕克为 Smalltalk 发明了这种软件设计模式。
现在,MVC 已经成为主流的客户端编程框架,在 iOS 开发中,系统为我们实现好了公共的视图类:UIView,和控制器类:UIViewController。大多数时候,我们都需要继承这些类来实现我们的程序逻辑,因此,我们几乎逃避不开 MVC 这种设计模式。

How MVC work


总的来说,视图(view)传送指令到Controller,Controller完成业务逻辑后,依赖指令去选择加载某个Model或要求Model改变状态,Model将新的数据发送给view,view更新数据,用户得到反馈。


How to communicate between M-V-C


该部分图片及内容来自斯坦福大学公开课,我认为他就 iOS 方面的MVC的通信的描述,还是比较好的。内容概括为以下几点:

communications
1、Between Controller and View
2、Between Controller and Model
3、Between Model and View

总结,在iOS开发中,我们以一个滚动视图scrollView为例,当View开始滚动,View先向Controller询问,“我是否可以滚”,被允许后,视图开始滚动,并向Controller索要数据,Controller转向Model获取数据,拿到数据后,通过dataSource把数据交给View显示。

Advantages and disadvantages


我们对于 MVC 这种设计模式真的用得好吗?其实不是的,MVC 这种分层方式虽然清楚,但是如果使用不当,很可能让大量代码都集中在 Controller 之中,让 MVC 模式变成了 Massive View Controller 模式。

Ligher ViewControllers


常见的瘦身方法:

具体抽取哪些逻辑呢?

累了!休息一下!

这里是休息区~~~比如,逗逗狗、撸一把...


MVC衍生的MVVM 架构


MVVM是Model-View-ViewModel的简称,MVVM模式依赖于数据绑定,能自动将对象属性和UI controls相联系是其框架级的特性。举个栗子,在微软的WPF框架里,ViewModel将TextField里的Text属性和Username属性绑定,如下所示:

<TextField Text=”{DataBinding Path=Username, Mode=TwoWay}”/>

WPF框架将两个属性绑定在一起。TwoWay绑定确保ViewModel中的Username属性改变时会为TextField的Text属性改变做准备,而且可逆.例如用户输入时ViewModel的变化。另一个例子是著名的基于MVVM的网页框架Knockout,你可以在动作里看到相似的绑定特性:

<input data-bind=”value: username”/>

上面将HTML元素的一个属性和JavaScript模型绑定。
遗憾的是,iOS缺乏数据绑定的框架,但这正是ReactiveCocoa所扮演的角色:进行ViewModel连接"粘合"工作。从iOS开发的角度来看MVVM模式,ViewController和其相关的UI(无论是nib、storyboard或者纯代码组成的View)通过ReactiveCocoa将它们绑定在一起。

MVVMReactiveCocoa.png

例如,我们创建一个ViewModel的新实例,继而构建和返回View。以下代码作用为初始化应用的navigation controller.

- (UIViewController *)createInitialViewController {
 self.viewModel = [RWTFlickrSearchViewModel new]; 
 return [[RWTFlickrSearchViewController alloc] initWithViewModel:self.viewModel];
}

总结,MVVM是一种设计架构,或者说是一种程序设计思想。MVVM中将ViewModel与View之间进行双向数据绑定。至于如何实现绑定,在iOS中采用的是ReactiveCocoa,使View拥有对ViewModel的引用,两者进行绑定。使两者得到同步。另外,ReactiveCocoa 经常在ViewModel里来监测它本身状态来进行其它操作。【结束:ReactiveCocoa单独成章介绍】

【学习链接】
MVVM与ReactiveCocoa的运用
MVVM Tutorial with ReactiveCocoa

上一篇 下一篇

猜你喜欢

热点阅读