iOS-MVVM架构优化
MVVM模式将Presenter改名为ViewModel,基本上与MVP模式完全一致。
唯一的区别是,它采用双向绑定(data-binding) : View<->ViewModel, ViewModel作为Model中值的映射,是数据发生改变时,通知View中发生改变,以后不需要考虑View和Model之间的交互更新,只需着手界面布局逻辑即可。
①View和Model 不直接关联,而是通过ViewModel作为枢纽,沟通View和Model之间的关系。
②View中控件的值与属性进行绑定,通过KVO键值观察(这样当model的值发生变化时,View会自动发生改变)
View和Model通过ViewModel实现动态关联。
1.MVVModel代码
#import <Foundation/Foundation.h> @interface MVVMModel : NSObject @property(nonatomic,copy)NSString *name; @end
2.MVVMViewModel代码
MVVMViewModel.h
#import <Foundation/Foundation.h> #import "MVVMModel.h" @interface MVVMViewModel : NSObject @property(nonatomic,copy)NSString *nameStr; @property(nonatomic,strong)MVVMModel *model;-(void)setWithModel:(MVVMModel *)model; -(void)clickChangeName; @end
MVVMViewModel.m
#import "MVVMViewModel.h"@implementation MVVMViewModel -(instancetype)init{if (self = [super init]) {}return self; }-(void)setWithModel:(MVVMModel *)model{self.model = model;self.nameStr = model.name; } -(void)clickChangeName{self.model.name = [NSString stringWithFormat:@"name%d",arc4random()%10];self.nameStr = self.model.name;NSLog(@"%@",self.nameStr); } @end
3.MVVMView代码
#import <UIKit/UIKit.h> #import "MVVMViewModel.h" @interface MVVMView : UIView -(void)setWithViewModel:(MVVMViewModel *)vm; @end#import "MVVMView.h" @interface MVVMView ()@property(nonatomic,strong)MVVMViewModel *vm; @property(nonatomic,strong)UILabel *label; @property(nonatomic,strong)UIButton *button;@end @implementation MVVMView- (instancetype)init {self = [super init];if (self) {self.backgroundColor = [UIColor whiteColor];self.frame = [UIScreen mainScreen].bounds;self.label = [[UILabel alloc]initWithFrame:CGRectMake(150,100 , 100, 30)];self.label.backgroundColor = [UIColor orangeColor];[self addSubview:_label];self.button = [UIButton new];_button.backgroundColor = [UIColor redColor];[_button setTitle:@"点击" forState:UIControlStateNormal];[_button addTarget:self action:@selector(mvvmClickChangModel) forControlEvents:UIControlEventTouchUpInside];_button.frame = CGRectMake(150, 200, 50, 50);[self addSubview:_button];}return self; } - (void)setWithViewModel:(MVVMViewModel *)vm {self.vm = vm;//KVO[self.vm addObserver:self forKeyPath:@"nameStr" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];self.label.text = vm.nameStr;}-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change: (NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{if ([keyPath isEqualToString:@"nameStr"]&&[change objectForKey:NSKeyValueChangeNewKey]) {NSNumber *new = [change objectForKey:NSKeyValueChangeNewKey];self.label.text = [NSString stringWithFormat:@"%@",new];} } -(void)mvvmClickChangModel{[self.vm clickChangeName]; }-(void)dealloc{[self.vm removeObserver:self forKeyPath:@"nameStr"]; } @end
3.ViewController.m
#import "ViewController.h" #import "MVVMView.h" #import "MVVMModel.h" #import "MVVMViewModel.h"@interface ViewController () @property (nonatomic, strong) MVVMViewModel * viewModel ; @end@implementation ViewController - (void)viewDidLoad {[super viewDidLoad];MVVMView *MView = [MVVMView new];MVVMModel *model = [MVVMModel new];model.name = @"name1";MVVMViewModel *viewModel = [MVVMViewModel new];[self.view addSubview:MView];//*viewModel 作为枢纽 沟通view和model之间关系 [viewModel setWithModel:model];[MView setWithViewModel:viewModel]; } @end
转载于:https://www.cnblogs.com/StevenHuSir/p/AppArchitecture_MVVM.html
iOS-MVVM架构优化相关推荐
- 新浪微博iOS客户端架构与优化之路
随着Facebook.Twitter.微博的崛起,向UGC.PGC.OGC,自媒体提供平台的内 容消费型App逐渐形成了独特的客户端架构模式.与电商和通讯工具类App不同,微博客户端具有多信息流.内容 ...
- ios mvvm框架的封装_iOS MVVM架构总结
为什么使用MVVM iOS中,我们使用的大部分都是MVC架构.虽然MVC的层次明确,但是由于功能日益的增加.代码的维护,使得更多的代码被写在了Controller中,这样Controller就显得非常 ...
- 猿题库 iOS 客户端架构设计-唐巧
序 猿题库是一个拥有数千万用户的创业公司,从20013年题库项目起步到2015年,团队保持了极高的生产效率,使我们的产品完成了五个大版本和数十个小版本的高速迭代. 在如此快速的开发过程中,如何保证代码 ...
- iOS 应用架构 (二)
iOS 客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答 iOS 应用架构中的种种问题,本文是其中的第二篇,主要讲 View 层的组织和调用方案.上篇主要讲 View ...
- iOS 应用架构谈:view 层的组织和调用方案
iOS 应用架构谈:view 层的组织和调用方案 iOS应用架构谈 开篇 iOS应用架构谈 view层的组织和调用方案 iOS应用架构谈 网络层设计方案 iOS应用架构谈 动态部署方案 iOS应用架构 ...
- 实践干货!猿题库 iOS 客户端架构设计
序 猿题库是一个拥有数千万用户的创业公司,从2013年题库项目起步到2015年,团队保持了极高的生产效率,使我们的产品完成了五个大版本和数十个小版本的高速迭代.在如此快速的开发过程中,如何保证代码的质 ...
- 天弘基金移动App客户端架构优化之路
天弘基金移动App客户端架构优化之路 随着移动互联网时代的到来,移动技术也随之飞速发展.如今,APP已成为绝大多数互联网企业用来获取用户的核心渠道.与此同时,伴随着业务量的增长,愈来愈多的APP也在不 ...
- Nice是如何做iOS客户端架构的?
一个创业产品的iOS客户端架构到底怎么做呢?现下最有活力的图片社交软件Nice的技术负责人刘诗彬将为我们解答创业产品如何实现iOS客户端架构. 分享人:刘诗彬,毕业于北京邮电大学电子信息科学与技术专业 ...
- 猿题库 iOS 客户端架构设计
推荐序 我几周前写过一篇文章,叫 <被误解的 MVC 和被神化的 MVVM>,其中的很多思想是和本文的作者 Lancy 交流获得的.当时很多人回复问:能直接上猿题库的代码吗?这次 Lanc ...
- 滴滴android架构演进,滴滴出行iOS客户端架构演进之路
自从蘑菇街的李忠老师在移动前线群里做了一次关于iOS组件化的分享之后,大家对于iOS客户端的架构非常感兴趣,展开了热烈的讨论.我很认同一句话,架构都是演变出来的,没有最好的架构,只有最合适的架构,刚好 ...
最新文章
- nginx解析php
- vim 多窗口,多tab编辑
- 面试离职理由_面试一个月都没有成功,是种什么样的神奇体验?
- Vue.js2.0核心思想
- 基于环信sdk的陌生人交友php服务器代码开源
- easyui的textbox实现编辑保存_第80讲:工作表数据与UserForm窗口的交互,记录的编辑和保存...
- 自动化运维专题之zabbix课程内容大纲
- plt绘制1 / (1 + np.exp(-x))
- python指定目录_python生成指定文件夹目录树
- hibernate运行很慢?查一张只有几条记录的表都要一俩分钟?[问题记录]
- [C# 开发技巧]实现属于自己的截图工具
- python os模块
- wim工具扫描linux磁盘,图文解说WIMTOOL的安装及利用该工具编辑WIM文件
- 此windows7副本不是正版、黑屏7601的解决办法
- 团队的英文翻译缩写_团队的英语是什么?简写呢?
- lotus version 0.3.0+git1bfa2311 安装 interopnet
- python:max函数
- 独家:为了永不停机的计算服务 - 五月月刊 | 凌云时刻
- 国内定制android系统吗,同样都是基于Android系统 国产定制系统差异有多大?
- c语言输出cad scr文件,CAD脚本文件(*.scr)有什么用?