这里并不是去讲各种模式的定义,仅记录下一些需要注意的点。
MVC
需要注意的是在列表视图的demo中tableviewcell在赋值时直接传递model过去是不合适的,像这样的代码[self setModel:model] 然后cell在内部持有model,并通过model中的数据去更新cell上的控件。mvc的原则就是view不能直接与model沟通,这样做直接就耦合了。正确的做法应该是将需要传递的model改为通用对象,让其遵循协议的方式去传递。如下图所示,cellModel并不是一个确定的类型,而是实现了某个协议的通用对象。这样的做法的好处是view完全不依赖于某一特定的model。view可以复用
MVP
mvp的模式的关键在与presenter,可以理解为vc之前需要处理与UI无关的逻辑统统放到这里了。给VC瘦身。而vc只负责UI的刷新。 v/vc需要强持有presenter,presenter则对v/vc弱引用(方便能直接拿到view实例,直接进行更新UI),也可以通过代理的方式去通知v/vc去更新。
这里需要定义两个协议:
1.presenter需要做的事情,将这些行为全部定义为协议方法。就叫做“presenterNeedTodoProtocol”吧,常见的可以包含的一些行为方法如:
2.v/vc需要做的事情,基本上都是与UI相关的。就叫做“viewNeedTodoProtocol”。
presenter获取数据之后是以代理的方式通知v/vc去做UI更新,实际开发中第2步中的代理可以不需要,可以设置presenter对v/vc弱引用,持有了vc则直接去操作内部的UI刷新。
3.mvp最大的问题在于需要定义协议,包括用户的所有操作和数据回调后的刷新,都是基于协议方法去执行,这样引出了大量的协议方法。v/vc虽然瘦身了,但是presenter会变大。
MVVM
mvvm的关键在与VM,VM包含了v/vc中的业务逻辑、网络请求、用户操作实际的处理者、数据处理逻辑等。
VM会持有Model,VC则持有VM。当VM中的数据发生变化时通知vc去改变UI;当vc中触发了用户事件(如用户点击了某个按钮)时,vc会将事件通知给VM去处理。
这里的关键点在于:
1.数据绑定
如何去做数据绑定,即数据发生变化时如何去通知vc进行更新,常见的有box、rac等。数据的绑定往往是在vc中进行的
2.vc将用户事件传递给VM去处理
3.VM中的事件可以单独拿出来进行单元测试。例如测试网络请求的逻辑,获取到的数据是否与预期的是匹配的。