今天在学习一个用MVVM模式写的项目,掌握一下对MVVM的理解和记的一些笔记.

下面是自己学习的项目链接:

http://www.code4app.com/ios/一个MVVM架构的iOS工程/695f5862-f1d5-11e5-af82-00163e0606f4

1.

一个MVVM架构的iOS工程 :

Model层是少不了的了,我们得有东西充当DTO(数据传输对象),当然,用字典也是可以的,Model层是比较薄的一层;

ViewModel层,就是View和Model层的粘合剂,他是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他各种各样的代码的极好的地方。说白了,就是把原来ViewController层的业务逻辑和页面逻辑等剥离出来放到ViewModel层。

View层,就是ViewController层,他的任务就是从ViewModel层获取数据,然后显示。

2.

1>

自定义Model类:

@interface PublicModel : NSObject

@property (strong, nonatomic) NSString *userId;

@property (strong, nonatomic) NSString *weiboId;

@property (strong, nonatomic) NSString *userName;

@property (strong, nonatomic) NSURL *imageUrl;

@property (strong, nonatomic) NSString *date;

@property (strong, nonatomic) NSString *text;

@end

ViewModel部分:

1>自定义Model1类,接收数据:

 #pragma 接收穿过来的block
-(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock
WithErrorBlock: (ErrorCodeBlock) errorBlock
WithFailureBlock: (FailureBlock) failureBlock
{
_returnBlock = returnBlock;
_errorBlock = errorBlock;
_failureBlock = failureBlock;
}

2>再定义Model2类,继承自Model1类:

进行网络请求,对请求下来的数据进行数据处理,处理跳转到详情页面.

 @implementation PublicWeiboViewModel

 //获取公共微博
-(void) fetchPublicWeiBo
{
NSDictionary *parameter = @{TOKEN: ACCESSTOKEN,
COUNT: @""
};
[NetRequestClass NetRequestGETWithRequestURL:REQUESTPUBLICURL WithParameter:parameter WithReturnValeuBlock:^(id returnValue) { DDLog(@"%@", returnValue);
[self fetchValueSuccessWithDic:returnValue]; } WithErrorCodeBlock:^(id errorCode) {
DDLog(@"%@", errorCode);
[self errorCodeWithDic:errorCode]; } WithFailureBlock:^{
[self netFailure];
DDLog(@"网络异常"); }]; } #pragma 获取到正确的数据,对正确的数据进行处理
-(void)fetchValueSuccessWithDic: (NSDictionary *) returnValue
{
//对从后台获取的数据进行处理,然后传给ViewController层进行显示 NSArray *statuses = returnValue[STATUSES];
NSMutableArray *publicModelArray = [[NSMutableArray alloc] initWithCapacity:statuses.count]; for (int i = ; i < statuses.count; i ++) {
PublicModel *publicModel = [[PublicModel alloc] init]; //设置时间
NSDateFormatter *iosDateFormater=[[NSDateFormatter alloc]init];
iosDateFormater.dateFormat=@"EEE MMM d HH:mm:ss Z yyyy"; //必须设置,否则无法解析
iosDateFormater.locale=[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"];
NSDate *date=[iosDateFormater dateFromString:statuses[i][CREATETIME]]; //目的格式
NSDateFormatter *resultFormatter=[[NSDateFormatter alloc]init];
[resultFormatter setDateFormat:@"MM月dd日 HH:mm"]; publicModel.date = [resultFormatter stringFromDate:date];
publicModel.userName = statuses[i][USER][USERNAME];
publicModel.text = statuses[i][WEIBOTEXT];
publicModel.imageUrl = [NSURL URLWithString:statuses[i][USER][HEADIMAGEURL]];
publicModel.userId = statuses[i][USER][UID];
publicModel.weiboId = statuses[i][WEIBOID]; [publicModelArray addObject:publicModel]; } self.returnBlock(publicModelArray);
} #pragma 对ErrorCode进行处理
-(void) errorCodeWithDic: (NSDictionary *) errorDic
{
self.errorBlock(errorDic);
} #pragma 对网路异常进行处理
-(void) netFailure
{
self.failureBlock();
} #pragma 跳转到详情页面,如需网路请求的,可在此方法中添加相应的网络请求
-(void) weiboDetailWithPublicModel: (PublicModel *) publicModel WithViewController:(UIViewController *)superController
{
DDLog(@"%@,%@,%@",publicModel.userId,publicModel.weiboId,publicModel.text);
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
PublicDetailViewController *detailController = [storyboard instantiateViewControllerWithIdentifier:@"PublicDetailViewController"];
detailController.publicModel = publicModel;
[superController.navigationController pushViewController:detailController animated:YES]; } @end

3.Controller部分:

接收model数据,定义表视图,实现其协议方法.

 @implementation PublicTableViewController

 - (void)viewDidLoad {
[super viewDidLoad]; // 接收数据 PublicWeiboViewModel *publicViewModel = [[PublicWeiboViewModel alloc] init]; [publicViewModel setBlockWithReturnBlock:^(id returnValue) { [SVProgressHUD dismiss];
_publicModelArray = returnValue;
[self.tableView reloadData];
DDLog(@"%@",_publicModelArray); } WithErrorBlock:^(id errorCode) { [SVProgressHUD dismiss]; } WithFailureBlock:^{ [SVProgressHUD dismiss]; }]; [publicViewModel fetchPublicWeiBo]; [SVProgressHUD showWithStatus:@"正在获取用户信息……" maskType:SVProgressHUDMaskTypeBlack]; } - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return ;
} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return _publicModelArray.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
PublicCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PublicCell" forIndexPath:indexPath]; [cell setValueWithDic:_publicModelArray[indexPath.row]]; return cell;
} -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
PublicWeiboViewModel *publicViewModel = [[PublicWeiboViewModel alloc] init];
[publicViewModel weiboDetailWithPublicModel:_publicModelArray[indexPath.row] WithViewController:self];
}

总结:

1.其实际上MVVM和MVC设计模式大体上是一样的,只是把MVC在C中请求网络和处理数据信息的部分子类了在ViewModel中实现,减轻了C的负担和代码量;

2.Model的存储数据还是不变;

MVVM的项目学习和笔记的更多相关文章

  1. 郭霖 - MVVM开源项目学习

    https://blog.csdn.net/guolin_blog/article/details/87900605 https://medium.com/androiddevelopers/view ...

  2. 李宏毅强化学习完整笔记!开源项目《LeeDeepRL-Notes》发布

    Datawhale开源 核心贡献者:王琦.杨逸远.江季 提起李宏毅老师,熟悉强化学习的读者朋友一定不会陌生.很多人选择的强化学习入门学习材料都是李宏毅老师的台大公开课视频. 现在,强化学习爱好者有更完 ...

  3. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  4. ng-深度学习-课程笔记-0: 概述

    课程概述 这是一个专项课程(Specialization),包含5个独立的课程,学习这门课程后做了相关的笔记记录. (1) 神经网络和深度学习 (2)  改善深层神经网络:超参数调试,正则化,优化 ( ...

  5. 学习ThinkPHP笔记

    学习ThinkPHP笔记 TP的模块化设计 名称 描述 应用 基于同一个入口文件访问的项目我们称之为一个应用. 模块 一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录. 控制器 ...

  6. 每天成长一点---WEB前端学习入门笔记

    WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...

  7. 转:从开源项目学习 C 语言基本的编码规则

    从开源项目学习 C 语言基本的编码规则 每个项目都有自己的风格指南:一组有关怎样为那个项目编码约定.一些经理选择基本的编码规则,另一些经理则更偏好非常高级的规则,对许多项目而言则没有特定的编码规则,项 ...

  8. DSP28377S - ADC学习编程笔记

    DSP28377S -  ADC学习编程笔记 彭会锋 2016-08-04  20:19:52 1 ADC类型导致的配置区别 F28377S的ADC类型是Type 4类型,我的理解是不同类型的ADC采 ...

  9. 学习ReactNative笔记整理一___JavaScript基础

    学习ReactNative笔记整理一___JavaScript基础 ★★★笔记时间- 2017-1-9 ★★★ 前言: 现在跨平台是一个趋势,这样可以减少开发和维护的成本.第一次看是看的ReactNa ...

随机推荐

  1. Python 字节码bytecode

    字节码bytecode python把源码文件编译成字节码文件,存放在__pycahe子目录内,用.pyc结尾.之后如果不再修改源码文件,运行时则使用*.pyc文件编译成机器码,这样不但运行速度快,而 ...

  2. python utf8

    1. # coding:utf-8 作用是定义源代码的编码. 如果没有定义, 此源码中是不可以包含中文字符串的.PEP 0263 -- Defining Python Source Code Enco ...

  3. 关于webpack require.context() 的那点事

    先说 webpack里面有这么一招:使用require.context()方法来自动导入模块 官方文档有点深奥,老衲百度下拿了一段来直接使用,但是想看下它是如何运行的 本篇这里不会有太深入的研究,只是 ...

  4. EF非常见错误:EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配

    EF非常见错误:EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 问题原因: 两个表A\B之间存在外键关系,当插入表A的时候,A的外键B在B表中不存在可以引起这个问题: ...

  5. 本地启动服务,两个进程分别监听两个端口,导致两个 URL 不同

    问题描述: 本地启了两个服务:A(http://localhost:8001) B(http://localhost:8000),A 项目要怎么才能关联到 B 项目,也就是 A 项目请求怎么跳到 B ...

  6. Codeforces 1180E Serge and Dining Room

    题意: 有\(n\)个菜肴,有\(m\)个小朋友,每个菜肴的价格为\(a_i\),每个小朋友有\(b_i\)元钱,小朋友从\(1 \rightarrow m\)依次购买菜肴,当第\(i\)个小朋友轮到 ...

  7. Apache Web服务器 安装步骤 和遇到的坑

    Apache Web服务器是开发放源码的网页服务器,我们看到的网页都是上传到服务器然后呈现给用户的. 在开发中,在自己的电脑上安装Apache Web服务器,你的电脑也会成为服务器,配置文件,访问你的 ...

  8. VUE项目开发流程

    前期准备 安装npm 安装webpack\vue-cli(2.9.6版本--版本不同可能会导致以下一些目录结构以及错误解决办法不符合实际情况) 创建项目 初始化创建项目,项目名称.项目描述.拥有者等等 ...

  9. H5的pushState与replaceState的用法

    一.简介 HTML5引入了 history.pushState()和 history.replaceState()方法,它们分别可以添加和修改历史记录条目.这些方法通常与window.onpopsta ...

  10. 基于Ryu REST API的VLAN实现

    目录 0.预备知识 1.实验内容 2.编写脚本addflow.sh一步实现流表下发 3.使用api查看流表 4.实验结果 0.预备知识 ryu控制器的API文档:ryu.app.ofctl_rest ...