直入主题吧,MVVM究竟是什么?
首先MVVM(Model-View-View Model)应该说是一种开发的架构,说到架构你一定听说过MVC,那么他们究竟有什么不同呢?
先放一张传统MVC的图(网上找的)
Model呈现数据,View呈现UI,Controller内进行各种数据处理、运算为Model和View进行数据交互 。
当使用MVC架构进行代码编写的时候,大家可能会发现,在一些复杂的界面,ViewController会有大量代码,显得特别臃肿,它既要处理数据,又要控制UI的展现,一个ViewControll写到上千行时,想找的一个特定的方法都有点困难。
那么使用MVVM架构会怎样呢?
再放一张图(自己画是不可能的了,一辈子都不会画的~)
这里引入了一个新的模块View Model,其实它的出现就是为了减轻Controller的臃肿和复杂程度,我们可以将数据在ViewModel中进行处理,并暴露出View可以直接使用的数据。
在我看来ViewModel和Model有一些相似之处,Model是根据后台返回的数据而创建的,那么ViewModel则是根据UI需要的数据而创建的。就是将原来写在Controller中的各种逻辑代码写到它身上,最终暴露出结果供View使用。
例如:
在MVC架构下我们需要在ViewController中写到
self.PriceLabel.text = [NSString stringWithFormat:@"%@ %.2f",self.model.Currency,self.model.UnitPrice *self.model.Quantity];
而在MVVM架构下,我们可以将各种逻辑运算写到ViewModel中
在ViewModel.h文件暴露View需要的数据
@property (nonatomic,strong) NSString * PriceLabel_Text;
在ViewModel.m文件中进行数据处理
self.PriceLabel_Text = [NSString stringWithFormat:@"%@ %.2f",self.model.Currency,self.model.UnitPrice *self.model.Quantity];
那么这时Controller只需要直接使用ViewModel暴露的数据即可
self.PriceLabel.text = self.ViewModel.PriceLabel_Text;
这样就降低了Controller的复杂度,将大量的逻辑代码迁移至ViewModel中,在复杂的界面中,这种架构的好处会更加明显。
同样的在调试时ViewController不再需要做更多的复杂操作,同时也可以在ViewModel中模拟各种数据在View中展现出来。
最后关于数据与控件绑定,在MVC中可以使用KVO直接在ViewController中绑定Model和控件,当Model的值发生改变,那么控件会立即刷新成新的值,但是MVVM中我们需要将Model与ViewModel绑定,而ViewModel与View中的控件绑定。即Model的值发生改变时,ViewModel会进行逻辑运算,计算出新的值。当ViewModel计算出新值时,View中对应控件会立即刷新显示新的值。如果需要反向从View去改变Model的值则需要更加复杂的设计,这样确实在APP运行时MVVM架构会占用更多的内存。
以上就是我对MVVM架构的一些粗浅理解,如果有理解错误的地方希望大家及时指正我,也希望各路大神进行补充,万分感谢~
网友评论