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架构优化相关推荐

  1. 新浪微博iOS客户端架构与优化之路

    随着Facebook.Twitter.微博的崛起,向UGC.PGC.OGC,自媒体提供平台的内 容消费型App逐渐形成了独特的客户端架构模式.与电商和通讯工具类App不同,微博客户端具有多信息流.内容 ...

  2. ios mvvm框架的封装_iOS MVVM架构总结

    为什么使用MVVM iOS中,我们使用的大部分都是MVC架构.虽然MVC的层次明确,但是由于功能日益的增加.代码的维护,使得更多的代码被写在了Controller中,这样Controller就显得非常 ...

  3. 猿题库 iOS 客户端架构设计-唐巧

    序 猿题库是一个拥有数千万用户的创业公司,从20013年题库项目起步到2015年,团队保持了极高的生产效率,使我们的产品完成了五个大版本和数十个小版本的高速迭代. 在如此快速的开发过程中,如何保证代码 ...

  4. iOS 应用架构 (二)

    iOS 客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答 iOS 应用架构中的种种问题,本文是其中的第二篇,主要讲 View 层的组织和调用方案.上篇主要讲 View ...

  5. iOS 应用架构谈:view 层的组织和调用方案

    iOS 应用架构谈:view 层的组织和调用方案 iOS应用架构谈 开篇 iOS应用架构谈 view层的组织和调用方案 iOS应用架构谈 网络层设计方案 iOS应用架构谈 动态部署方案 iOS应用架构 ...

  6. 实践干货!猿题库 iOS 客户端架构设计

    序 猿题库是一个拥有数千万用户的创业公司,从2013年题库项目起步到2015年,团队保持了极高的生产效率,使我们的产品完成了五个大版本和数十个小版本的高速迭代.在如此快速的开发过程中,如何保证代码的质 ...

  7. 天弘基金移动App客户端架构优化之路

    天弘基金移动App客户端架构优化之路 随着移动互联网时代的到来,移动技术也随之飞速发展.如今,APP已成为绝大多数互联网企业用来获取用户的核心渠道.与此同时,伴随着业务量的增长,愈来愈多的APP也在不 ...

  8. Nice是如何做iOS客户端架构的?

    一个创业产品的iOS客户端架构到底怎么做呢?现下最有活力的图片社交软件Nice的技术负责人刘诗彬将为我们解答创业产品如何实现iOS客户端架构. 分享人:刘诗彬,毕业于北京邮电大学电子信息科学与技术专业 ...

  9. 猿题库 iOS 客户端架构设计

    推荐序 我几周前写过一篇文章,叫 <被误解的 MVC 和被神化的 MVVM>,其中的很多思想是和本文的作者 Lancy 交流获得的.当时很多人回复问:能直接上猿题库的代码吗?这次 Lanc ...

  10. 滴滴android架构演进,滴滴出行iOS客户端架构演进之路

    自从蘑菇街的李忠老师在移动前线群里做了一次关于iOS组件化的分享之后,大家对于iOS客户端的架构非常感兴趣,展开了热烈的讨论.我很认同一句话,架构都是演变出来的,没有最好的架构,只有最合适的架构,刚好 ...

最新文章

  1. nginx解析php
  2. vim 多窗口,多tab编辑
  3. 面试离职理由_面试一个月都没有成功,是种什么样的神奇体验?
  4. Vue.js2.0核心思想
  5. 基于环信sdk的陌生人交友php服务器代码开源
  6. easyui的textbox实现编辑保存_第80讲:工作表数据与UserForm窗口的交互,记录的编辑和保存...
  7. 自动化运维专题之zabbix课程内容大纲
  8. plt绘制1 / (1 + np.exp(-x))
  9. python指定目录_python生成指定文件夹目录树
  10. hibernate运行很慢?查一张只有几条记录的表都要一俩分钟?[问题记录]
  11. [C# 开发技巧]实现属于自己的截图工具
  12. python os模块
  13. wim工具扫描linux磁盘,图文解说WIMTOOL的安装及利用该工具编辑WIM文件
  14. 此windows7副本不是正版、黑屏7601的解决办法
  15. 团队的英文翻译缩写_团队的英语是什么?简写呢?
  16. lotus version 0.3.0+git1bfa2311 安装 interopnet
  17. python:max函数
  18. 独家:为了永不停机的计算服务 - 五月月刊 | 凌云时刻
  19. 国内定制android系统吗,同样都是基于Android系统 国产定制系统差异有多大?
  20. c语言输出cad scr文件,CAD脚本文件(*.scr)有什么用?

热门文章

  1. [IOC]Unity使用
  2. Mysql date time formate
  3. REVIT使用中遇到的各种问题汇总
  4. BSP技术详解3---有图有真相
  5. 视网膜脱落相关知识(持续更新中)
  6. Java EE的三层架构
  7. celery无密码连接redis与带密码连接redis
  8. hive中的数据库与mysql中的hive数据库的关系
  9. python委托模式详细解释
  10. 大话数据结构 01 :顺序线性表