移动开发架构的MVVM概念及其由来MVVM是Model-View-ViewModel的缩写。最早由微软提出并使用。它是一种结合MVP(Model-View-Presenter)模式和WPF应用方式而发展起来的新型架构。MVVM概念解释及要点1.基本概念mvvm1.png模型:主要为应用程序提供数据。View:在MVC和MVP中仍然是表现层,同时实现UI元素和ViewModel属性的绑定。ViewModel:为View提供数据支持。从胖瘦的角度来看,MVVM中的Model通常是胖Model,有数据属性的定义,有数据访问和处理的行为。ViewModel通常是一个只有数据属性的瘦模型,通常包含少量逻辑。2、基本要点ViewholdsViewModel:在View中,UI元素的属性和ViewModel通过绑定关联,UI元素的属性变化和ViewMode的数据属性具有双向作用。ViewModelholdsModel:Model为ViewModel提供数据支持,ViewModel的数据属性发生变化也会影响Model进行数据提交。Model和ViewModel在功能上的区别在于ViewModel是View支持的,其结构与View是一致的。模型来源于业务处理,维护业务数据的基本关联性和完整性。当Model层结束查询或操作时,结果会更新到ViewModel层。因为ViewModel层绑定了View,通知UI层更新,体现了数据驱动界面的思想。3.优点MVVM模式与MVC模式相同。主要目的是分离视图(View)和模型(Model)。有几个优点:低耦合。View和Model通过ViewMode隔离,让View和Model相互独立,一方的改变和修改不会影响另一方。可重用性。一个模型和视图模型可以为多个视图提供服务。自主开发。UI开发工作与业务处理工作分开,适合团队合作。可测试的。接口一直很难测试,但现在可以为ViewModel编写测试。MVVM的经典例子WPFMVVM并不是一个新概念。由于其在移动开发中的应用,目前被广泛讨论。解释MVVM,离不开WPF的起源、概念定义、最佳应用。当MVVM和WPF结合时,除了满足MVVM的基本架构模式外,由于UI编辑(Xaml)支持多模式数据和事件绑定,可以实现View和ViewModel的对接,同时,转换器和触发器的使用确保了它的灵活性。因此,无论你是想深入了解MVVM,还是寻求以MVVM模式构建产品,都建议你认真学习WPF的相关开发知识,这是一个很好的参考。在移动开发中使用MVVM在移动开发中使用MVVM时,view和viewcontroller(Android:BureauandActivity)正式联系在一起,我们将它们视为一个组件。view视图还是不能直接引用model模型,controller当然不能。相反,它们指的是视图模型viewmodel。MVVM.png用户输入验证逻辑,视图显示逻辑处理通常放在ViewController中,但视图的控制应尽可能受ViewModel的数据属性影响,而不是直接操作。发起网络请求、数据存储等处理都可以在Model中进行,但不能有任何对view本身的引用。(在模型中使用#importUIKit.h)可以将展示逻辑放在视图模型中(例如,将模型的值映射为格式化字符串),视图控制器本身将不再臃肿。使用MVVM的应用程序是高度可测试的;因为视图模型包含所有表示逻辑并且不引用视图,所以可以通过编程方式对其进行全面测试。在android开发方面,目前有类似RoboBinding这样的架构,可以实现与布局文件中ViewModel的绑定工作。在IOS中,通常推荐MVVM与ReactiveCocoa结合使用。Goo框架:IOSReactiveCocoa的MVVM模式的实现,作为一个响应式的概念,真的很火,备受推崇。从学习建筑设计思想的角度来说,我个人是非常喜欢的。但是,领导仍然不愿意将其用于产品开发。俗话说,喜欢一件事有很多原因,不喜欢也只有一个原因。Reactive不同于传统思维和基础IOS开发思维,需要一定代价的学习成本并不是每个团队都能接受的。什么是咕?小结:Goo是MVVM模式在IOS开发中的具体实现。使用Goo开发不会改变现有的开发习惯。在开发中,可以根据具体场景的方便程度来考虑是否使用Goo。总之,Goo具有体积小、灵活易用等特点。举个栗子,Goo.gif,如图,通过实现如下几个小功能,实现Goo的显示。1:在TextField中输入数据,其下方的Label同步显示2:点击左侧按钮改变数据内容,会同时影响TextField和Label的显示内容3:点击左侧按钮更改数据属性的权利,同时影响TextField和Label的不同属性。接下来看使用Goo的具体代码实现-(void)viewDidLoad{[superviewDidLoad];//在加载视图之后做任何额外的设置,通常来自一个nib._vm=[TrialDataVMusing];_vm.text=@"123";[self.inputTextbindingWithProperty:@"backgroundColor"withObject:_vmwithDataSource:@"backgroundColor"withBindingMode:TwoWay];[self.inputTextbindingWithProperty:@"text"withObject:_vmwithDataSource:@"text"withBindingMode:TwoWay];[self.hineLblbindingWithProperty:@"text"withObject:_vmwithDataSource:@"text"withBindingMode:OneWay];[self.hineLblbindingWithProperty:@"textColor"withObject:_vmwithDataSource:@"backgroundColor"withBindingMode:OneWay];}-(IBAction)clickAction:(id)sender{_vm.text=@"456";}-(IBAction)otherAction:(id)sender{_vm.backgroundColor=[UIColorredColor];}不要惊讶!代码只有几行。使用bindingWithProperty方法完成控件与ViewModel的绑定工作,以后只需要改变ViewModel,就会自动影响UI元素的属性。Goo是我基于MVVM模型开发的一个IOS下的开源框架。后面会写一篇文章介绍,代码也会分享到Github上。希望有兴趣的朋友加入,不断完善和推广。
