iOS开发中的MVC(一)
MVC:模型,视图,控制器,是iOS开发中用到的主要的设计模式。Model中处理逻辑与数据,View展示应用界面,接收用户的操作,而Controller夹在View和Model中间,当View接收到用户操作,他将通知Controller,Controller会判断采取什么样的措施,Controller也负责将逻辑和数据处理交给Model完成,根据返回结果来更新View。Controller就像胶水,将两个独立的部分粘合在一起。他们的图示如下:
iO
S MVC结构图
其中Y形的线表示了他们之间的通信规则:Model和Controller之间可以通信,View和Controller之间可以通信,而View和Model之间是禁止通信的。
Controller可以通过直接访问属性、调用方法,来控制Model和View,向他们传递消息,对于Storyboard和XIB文件,上面的控件可以通过生成outlet来调用,如果直接代码生成的话,就调用控件实例。
Controller必须实现View中所定义的target或者delegate方法,来实现View对Controller的回调。这样,View就可以通知Controller自己的变化,以及用户对View的操作。View还有data source方法,用于向Controller请求某些时刻需要显式的数据,比如UITableViewDataSource中,会在table view生成时,向Controller请求表格的行数和页面上可见的单元格中的内容。
Model可以通过Notification和KVO的方式来通知Controller在Model中数据的改变。也可以使用delegate或者block来实现,在AFNetworking中的网络状态变化通知,就是使用block来实现的。
把所有的逻辑和数据都放到Model层中,Model就会变得很杂乱,所以我习惯把Model再细分:
Service层,用于为Controller提供一些最直接的逻辑功能、数据封装,并且管理下一层模块,向下一层模块请求数据。Controller只管理他所拥有的View,以及与他直接相关的Service类。
Manager层,用于管理一大类操作,比如:数据同步功能,写一个数据同步的类,再类中处理网络状态判断、缓存数据的读写以及缓存数据的发送,错误处理。Manager层位于Service层之下,接受Service的调度。
Handler层,用于实现具体的操作,如:FileHandler,用来处理文件存储操作,将字符串或NSData数据转换成文件并存放在指定路径,以及一些多线程处理操作。Handler层接受Manager调度。
Model还有一些其它的部分:实现一些公共方法的Utility工具类,以及一些存储数据结构的类。
各个平级的层之间不允许互相调用,调用只能自上而下发生,回调都使用block来实现。这样实现,项目结构看起来就清晰了许多。Model结构图如下: