MVVM的项目学习和笔记

今天在学习一个用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类,接收数据:

1 #pragma 接收穿过来的block
2 -(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock
3                  WithErrorBlock: (ErrorCodeBlock) errorBlock
4                WithFailureBlock: (FailureBlock) failureBlock
5 {
6     _returnBlock = returnBlock;
7     _errorBlock = errorBlock;
8     _failureBlock = failureBlock;
9 }

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

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

 1 @implementation PublicWeiboViewModel
 2
 3 //获取公共微博
 4 -(void) fetchPublicWeiBo
 5 {
 6     NSDictionary *parameter = @{TOKEN: ACCESSTOKEN,
 7                                 COUNT: @"100"
 8                                 };
 9     [NetRequestClass NetRequestGETWithRequestURL:REQUESTPUBLICURL WithParameter:parameter WithReturnValeuBlock:^(id returnValue) {
10
11         DDLog(@"%@", returnValue);
12         [self fetchValueSuccessWithDic:returnValue];
13
14     } WithErrorCodeBlock:^(id errorCode) {
15         DDLog(@"%@", errorCode);
16         [self errorCodeWithDic:errorCode];
17
18     } WithFailureBlock:^{
19         [self netFailure];
20         DDLog(@"网络异常");
21
22     }];
23
24 }
25
26
27
28 #pragma 获取到正确的数据,对正确的数据进行处理
29 -(void)fetchValueSuccessWithDic: (NSDictionary *) returnValue
30 {
31     //对从后台获取的数据进行处理,然后传给ViewController层进行显示
32
33     NSArray *statuses = returnValue[STATUSES];
34     NSMutableArray *publicModelArray = [[NSMutableArray alloc] initWithCapacity:statuses.count];
35
36     for (int i = 0; i < statuses.count; i ++) {
37         PublicModel *publicModel = [[PublicModel alloc] init];
38
39         //设置时间
40         NSDateFormatter *iosDateFormater=[[NSDateFormatter alloc]init];
41         iosDateFormater.dateFormat=@"EEE MMM d HH:mm:ss Z yyyy";
42
43         //必须设置,否则无法解析
44         iosDateFormater.locale=[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"];
45         NSDate *date=[iosDateFormater dateFromString:statuses[i][CREATETIME]];
46
47         //目的格式
48         NSDateFormatter *resultFormatter=[[NSDateFormatter alloc]init];
49         [resultFormatter setDateFormat:@"MM月dd日 HH:mm"];
50
51         publicModel.date = [resultFormatter stringFromDate:date];
52         publicModel.userName = statuses[i][USER][USERNAME];
53         publicModel.text = statuses[i][WEIBOTEXT];
54         publicModel.imageUrl = [NSURL URLWithString:statuses[i][USER][HEADIMAGEURL]];
55         publicModel.userId = statuses[i][USER][UID];
56         publicModel.weiboId = statuses[i][WEIBOID];
57
58         [publicModelArray addObject:publicModel];
59
60     }
61
62     self.returnBlock(publicModelArray);
63 }
64
65 #pragma 对ErrorCode进行处理
66 -(void) errorCodeWithDic: (NSDictionary *) errorDic
67 {
68     self.errorBlock(errorDic);
69 }
70
71 #pragma 对网路异常进行处理
72 -(void) netFailure
73 {
74     self.failureBlock();
75 }
76
77
78 #pragma 跳转到详情页面,如需网路请求的,可在此方法中添加相应的网络请求
79 -(void) weiboDetailWithPublicModel: (PublicModel *) publicModel WithViewController:(UIViewController *)superController
80 {
81     DDLog(@"%@,%@,%@",publicModel.userId,publicModel.weiboId,publicModel.text);
82     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
83     PublicDetailViewController *detailController = [storyboard instantiateViewControllerWithIdentifier:@"PublicDetailViewController"];
84     detailController.publicModel = publicModel;
85     [superController.navigationController pushViewController:detailController animated:YES];
86
87 }
88
89
90 @end

3.Controller部分:

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

 1 @implementation PublicTableViewController
 2
 3 - (void)viewDidLoad {
 4     [super viewDidLoad];
 5
 6
 7     // 接收数据
 8
 9     PublicWeiboViewModel *publicViewModel = [[PublicWeiboViewModel alloc] init];
10
11     [publicViewModel setBlockWithReturnBlock:^(id returnValue) {
12
13         [SVProgressHUD dismiss];
14         _publicModelArray = returnValue;
15         [self.tableView reloadData];
16         DDLog(@"%@",_publicModelArray);
17
18     } WithErrorBlock:^(id errorCode) {
19
20         [SVProgressHUD dismiss];
21
22     } WithFailureBlock:^{
23
24         [SVProgressHUD dismiss];
25
26     }];
27
28     [publicViewModel fetchPublicWeiBo];
29
30     [SVProgressHUD showWithStatus:@"正在获取用户信息……" maskType:SVProgressHUDMaskTypeBlack];
31
32 }
33
34 - (void)didReceiveMemoryWarning {
35     [super didReceiveMemoryWarning];
36     // Dispose of any resources that can be recreated.
37 }
38
39 #pragma mark - Table view data source
40
41 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
42     return 1;
43 }
44
45 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
46
47     return _publicModelArray.count;
48 }
49
50
51 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
52     PublicCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PublicCell" forIndexPath:indexPath];
53
54     [cell setValueWithDic:_publicModelArray[indexPath.row]];
55
56     return cell;
57 }
58
59 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
60 {
61     PublicWeiboViewModel *publicViewModel = [[PublicWeiboViewModel alloc] init];
62     [publicViewModel weiboDetailWithPublicModel:_publicModelArray[indexPath.row] WithViewController:self];
63 }

总结:

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

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

时间: 2024-10-10 21:03:40

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

[SQLServer]学习总结笔记(基本涵盖Sql的所有操作)

--################################################################################### /* 缩写: DDL(Database Definition Language): 数据库定义语言 DML(Database Manipulation Language): 数据库操作语言 DCL(Database Control Language): 数据库控制语言 DTM(Database Trasaction Manag

学习hibernate笔记

以前学习java的时候,一开始就学习了hibernate,那时候总觉得ssh非常高大上,所以就急忙看了下相关视频.不过因为实际需要不高,所以后来一直没有使用上hibernate组件.现在一年过去了,也疯狂学习了java一段时间了,做过几个不大的项目,但是总算对java有些了解.现在参加了工作,公司使用的就是ssh,所以这两天又重新开始捣鼓hibernate.这次学习直接使用editplus,直接开发.看了官网的demo,发现英语也没有想象中那么困难.哈哈,把自己的学习记录下来吧.这里主要记录三个

Docker学习教程笔记整合(完整)

Docker学习教程笔记整合(完整) 本文主要是整理了DockerOne组织翻译的Flux7的Docker入门教程,通过markdown记录,方便离线学习.原文地址,http://dockone.io/article/101. 文中一些链接可能会跳转国外的网站,如果没有插件或开VPN的朋友,可以尝试修改一下Hosts文件,如何修改Hosts文件.或者使用XXNet插件,如何使用XXnet 介绍 Docker是一个新的容器化的技术,它轻巧,且易移植,号称"build once, configure

(转)大牛的《深度学习》笔记,60分钟带你学会Deep Learning。

大牛的<深度学习>笔记,60分钟带你学会Deep Learning. 2016-08-01 Zouxy 阅面科技 上期:<从特征描述到深度学习:计算机视觉发展20年> 回复“01”回顾全文   本期:大牛的<深度学习>笔记,60分钟带你学会Deep Learning. 深度学习,即Deep Learning,是一种学习算法(Learning algorithm),亦是人工智能领域的一个重要分支.从快速发展到实际应用,短短几年时间里,深度学习颠覆了语音识别.图像分类.文本

鸟哥的Linux私房菜——基础学习篇 —— 笔记2

at 语法 == 注意,输入at之后便进入命令行模式 ------- 不管怎么样,只会执行一次. [test @test test]# at [-m] TIME (输入工作指令)[test @test test]# atq (查看当前工作流程)[test @test test]# atrm [jobnumber] (删除流程) -m :执行at规范的工作流程时,将屏幕输出结果mail给输入指令的用户TIME :时间格式,有如下几个: ================== 格式有多种,但没有可以间

DSP28377S - ADC学习编程笔记

DSP28377S -  ADC学习编程笔记 彭会锋 2016-08-04  20:19:52 1 ADC类型导致的配置区别 F28377S的ADC类型是Type 4类型,我的理解是不同类型的ADC采样方式是不一样的:F28335ADC 采样序列可以配置为顺序采样和同步采样模式,而F28377S采样序列可以配置为round-robin or burst模式,这两种模式下面再讲解. 2 ADC上电配置步骤 首先明确一点,ADC是专用管脚,不需要配置GPIO,所以可以直接配置ADC的寄存器 //Wr

Python学习入门笔记(一):Python文件类型

1.源代码 扩展名:.py,由Python程序解释,不需要编译. --创建hello.py源文件 # cat hello.py  print 'Hello World!' --执行hello.py [[email protected] study]# chmod a+x hello.py  [[email protected] study]# python hello.py  Hello World! [[email protected] study]# ./hello.py  ./hello.

Python学习入门笔记(二):Python运算符

1.算术运算符 "+"加法:3+2=5 "-"减法:3-2=1 "*"乘法:3*2=6 "/"实数除法:3/2=1,3.0/2=1.5 "//"整数除法:5.6//2=2.0 "%"求余数:17%6=5 "**"求幂运算:2**3=8 2.赋值运算符 "="等于:x=3 "+="加等于:x+=2 "-="减等

学习ios笔记第一天的C语言学习记录

c语言基础学习 int num1 = 15; int num2 = 5; int temp = 0; //先把num1放到temp里 temp = num1; //先把num2放到num1里 num1 = num2; //先把temp放到num2里 num2 = temp; 算数运算符 +加法运算 -减法运算符 *乘法运算符 /除法运算符  ------整型相除取整,除数不为0 %取余运算符 ------两边均为整数 ++递增运算-------运算符在前,先执行:运算符在后,后执行: --递减运