传统的MVC
传统的MVC传统的M(Model)V(View)C(Controller)架构
优势:易于上手
劣势:三个实体是紧耦合的,每个实体和其他两个通信。这大大降低了可重用性。
“cell.model = model;”这句类似的代码有问题,cell中不应该引入model,要实现cell与model的解耦合。
苹果的MVC
苹果的MVC
Controller是View和Model之间的中介,这样他们三者就解耦了。
Controller过重,为View Controller减负也成为iOS开发者面临的一个重要话题。
缺点:并没有区分业务逻辑和业务展示, 这对单元测试很不友好。
MVP Model View Presenter(模型 视图 协调器)
MVPMVC的缺点在于并没有区分业务逻辑和业务展示, 这对单元测试很不友好。而MVP针对以上缺点做了优化, 它将业务逻辑和业务展示也做了一层隔离, 对应的就变成了MVCP. M和V功能不变, 原来的C现在只负责业务展示(也就可以说VC就是V), 而所有的逻辑全都转移到了P层。
优势:相对MVC来说,对C层进行减负,增加了P层。
劣势:View更新,需要通过代理通知P,P又需要通过代理通知VC。
MVVM
MVVM结合这张图,我们可以看出:当View|Controller有用户交互,就通过响应告诉ViewModel,然后Model改变,而ViewModel会监听到Model的改变然后通过Success回掉来更新UI
MVVM 的基本概念
在MVVM 中,view 和 view controller正式联系在一起,我们把它们视为一个组件
view 和 view controller 都不能直接引用model,而是引用视图模型(viewModel)
viewModel 是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他代码的地方
使用MVVM会轻微的增加代码量,但总体上减少了代码的复杂性
MVVM 的注意事项
view 引用viewModel ,但反过来不行(即不要在viewModel中引入#import UIKit.h,任何视图本身的引用都不应该放在viewModel中)(PS:基本要求,必须满足)
viewModel 引用model,但反过来不行
优势:低耦合、方便测试、可重用性:
低耦合:View 可以独立于Model变化和修改,一个 viewModel 可以绑定到不同的 View 上
可重用性:可以把一些视图逻辑放在一个 viewModel里面,让很多 view 重用这段视图逻辑
独立开发:开发人员可以专注于业务逻辑和数据的开发 viewModel,设计人员可以专注于页面设计
可测试:通常界面是比较难于测试的,而 MVVM 模式可以针对 viewModel来进行测试
劣势:block反向传值很方便,正向传值比较麻烦,所以一般结合RAC或RXSwift。
数据绑定使得Bug 很难被调试。你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。
对于过大的项目,数据绑定和数据转化需要花费更多的内存(成本)。主要成本在于:
数组内容的转化成本较高:数组里面每项都要转化成Item对象,如果Item对象中还有类似数组,就很头疼。
转化之后的数据在大部分情况是不能直接被展示的,为了能够被展示,还需要第二次转化。
只有在API返回的数据高度标准化时,这些对象原型(Item)的可复用程度才高,否则容易出现类型爆炸,提高维护成本。
调试时通过对象原型查看数据内容不如直接通过NSDictionary/NSArray直观。
同一API的数据被不同View展示时,难以控制数据转化的代码,它们有可能会散落在任何需要的地方。
参考了
还有一些路由模式
1、路由(蘑菇街)
2、target-action(CTMeditor)
3、beehive(阿里巴巴)
网友评论