今天在学习一个用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. Selenium(十)测试用例错误处理、日志接口、多用户测试

    1.一般的错误类型 2.查看错误提示,是一个div,以id为例找到该元素 3.修改测试用例 def checkResult(driver,err_id): try: err = driver.find ...

  2. python+requests----登录接口reponse中token传递给其他接口使用的一个简单小示例介绍

    #!/usr/bin/env python # coding=UTF-8 import requests def login(): url = "https://xxxx.xxx.xxx/v ...

  3. Java并发包--线程池原理

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509954.html 线程池示例 在分析线程池之前,先看一个简单的线程池示例. 1 import jav ...

  4. MFC消息路由

    1.Command Routing(命令传递):当消息进来时,会有一个泵推动它前进.消息如何进来,以有泵函数如何推动,都是属于windows程序设计的范畴, 消息如果是从子类流向父类(纵向流动),那么 ...

  5. vscode python文件注释乱码怎么办?

    VS Code 中文注释显示乱码 解决方法 将设置中的"files.autoGuessEncoding"项的值改为true即可. 1.文件 2.首选项 3.设置 4.搜索 &quo ...

  6. Collections(一)

    方法注释 /** * Returns an immutable list containing only the specified object. * The returned list is se ...

  7. process 请求数据解析问题

    开发过程中发现ajax提交的数据无法被express正确的解析,主要的情况是这样的: // 浏览器端post一个对象 $.ajax({ url:"/save", type:&quo ...

  8. CKEditor5 输入文字时拼音和汉字同时输入问题

    在使用 CKEditor5 + vue 时,出现输入文字时,拼音和文字一起输入到编辑器到问题.与之前项目中使用 ckeditor 的区别是,这次项目是在 python 架构下局部引入 ckeditor ...

  9. Java核心数据结构(List、Map、Set)原理与使用技巧

    JDK提供了一组主要的数据结构实现,如List.Set等常用数据结构.这些数据都继承自java.util.Collection接口,并位于java.util包内. 一.List接口 最重要的三种Lis ...

  10. LoadLibraryA 和 GetProcAddress 调用动态库

    通过LoadLibraryA 和 GetProcAddress,动态调用无需配置链接库lib和相关的头文件配置.下面介绍一个例子的实现 1.动态库 A.加法类 头文件:#pragma once cla ...