MVVM就是在MVC的基础上分离出业务处理的逻辑到viewModel层。

  M:  Model层是API请求的原始数据,充当DTO(数据传输对象),当然,用字典也是可以的,编程么,要灵活一些。Model层是比较薄的一层。

  V:  View层,视图展示,由viewController来控制,他的任务就是从ViewModel层获取数据,然后显示。

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

简单来说,就是API请求完数据,解析成model,之后在viewModel中转化成能够直接被视图层使用的数据,交付给前端。

model层

我们先从model层开始,在这里我们用JSONModel来解析,比如一个商品列表的model长这样:

这是我们的数据原型,API返回的数据通过JSONModel解析完成后的原始数据存在这里。

#import <JSONModel/JSONModel.h>
@protocol LVMProductListModel <NSObject>
@end // productList
@interface LVMProductListModel : JSONModel
@property (nonatomic, copy) NSString *imgUrl;
@property (nonatomic, copy) NSString *productId;
@property (nonatomic, copy) NSString *productName;
@property (nonatomic, copy) NSString *refPrice;
@end

viewModel 层

viewModel层是我们处理业务逻辑的核心层,在这里我们需要发起网络请求(如果网络请求较多,可以抽出来,只在ViewModel里调用)、解析数据、转换数据给前端。

#pragma mark - Public Methods
- (void)lvm_startLoadProductListWithPage:(NSInteger)page {
__weak typeof(self) weakSelf = self;
[NetWorkManager GET:self.lvm_baseURL
parameters:parameters
success:^(NSURLSessionDataTask *task, id responseObject) {
__strong typeof(weakSelf) strongSelf = weakSelf;
...
NSDictionary *resultDic = responseObject[@"rp_result"];
NSError *error = nil;
LVMProductListModel *model = [[LVMProductListModel alloc] initWithDictionary:resultDic error:&error];
if (error) {
...
}
[strongSelf _lvm_calProductLists:model.productlist];
if (strangles.delegate ...) {
...
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
...
}];
} - (void)_lvm_calProductLists:(NSArray *)productLists{
for (NSInteger i = ; i < productLists.count; ++i) {
LVMProductListModel *model = productLists[i];
LVMProductListItem *item = [[LVMProductListItem alloc] init];
item.lvm_productId = model.productId;
item.lvm_productName = model.productName;
item.lvm_productPrice = [NSString stringWithFormat:@"¥ %@", model.refPrice];
item.lvm_productImgURL = [Utils convertToRealUrl:model.imgUrl ofsize:];
[self.lvm_productLists addObject:item];
}
}

viewModel中将API返回的数据解析成model,并将model转化成可供view层直接使用的item,将item交付给前端使用。

经过viewModel转化之后的数据itemviewModel保存,与数据相关的处理都将在viewModel中处理。viewModel返回给view层的接口长这样:

@interface LVMProductListViewModel (CollectionViewDataSource)
- (NSInteger)lvm_numberOfItemsInSection:(NSInteger)section;
- (LVMProductListItem *)lvm_itemForIndexPath:(NSIndexPath *)indexPath;
@end

view层

view层是由viewController控制的。view层只做展示,不做业务处理。view层的数据由viewModel提供。view层看起来是这样的:

@implementation LVMProductListViewController

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self _lvm_initial];
[self _lvm_setupViewModel];
[self _lvm_setupSubViews];
[self.lvm_viewModel lvm_startLoadProductListWithPage:_lvm_currentPage];
} - (void)_lvm_initial {
...
self.lvm_currentPage = ;
} - (void)_lvm_setupViewModel {
self.lvm_viewModel = [[LVMProductListViewModel alloc] init];
_lvm_viewModel.lvm_delegate = self;
} #pragma mark - Subviews -
- (void)_lvm_setupSubViews {
...
[self _lvm_setupCollectionView];
...
} - (void)_lvm_setupCollectionView {
...
} #pragma mark - UICollectionView Delegate & Datosource
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return [self.lvm_viewModel lvm_numberOfItemsInSection:section];
} - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
LVMProductListItem *item = [self.lvm_viewModel lvm_itemForIndexPath:indexPath];
LVMProductListCollectionViewCell *cell = (LVMProductListCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:kLVMProductListCollectionViewCellId forIndexPath:indexPath];
[cell lvm_setupWithItem:item];
return cell;
}

浅谈iOS中MVVM的架构设计的更多相关文章

  1. 浅谈iOS中MVVM的架构设计与团队协作

    说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...

  2. IOS中 浅谈iOS中MVVM的架构设计与团队协作

    今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  3. 浅谈iOS中MVVM的架构设计与团队协作【转载】

    今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  4. iOS中MVVM的架构设计与团队协作

    对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架,之前用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与传统的MVC可谓是极为相似,也可以说是兄弟关系,也就是一家人 ...

  5. 浅谈iOS中的userAgent

    浅谈iOS中的userAgent   User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...

  6. js架构设计模式——由项目浅谈JS中MVVM模式

    1.    背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...

  7. 由项目浅谈JS中MVVM模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    背景 最近项目原因使用了durandal.js和knock ...

  8. 浅谈iOS中的视图优化

    引言: 让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为 ...

  9. 浅谈iOS中的单例模式

    iOS中的单例模式     就我本身理解而言,我认为的单例:单例在整个工程中,就相当于一个全局变量,就是不论在哪里需要用到这个类的实例变量,都可以通过单例方法来取得,而且一旦你创建了一个单例类,不论你 ...

随机推荐

  1. 【转载】springboot:如何优雅的使用mybatis

    这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关于spring boot ...

  2. create-react-app时registry的奇怪问题

    用React官方给的NPM脚本 create-react-app my-app 在自动安装module的过程中,在安装registry的组件的时候莫名其妙的挂住不动了.界面显示的信息如下: fetch ...

  3. [Functional Programming] Arrow contramap vs map and promap

    In previous post, Arrow Functor with contramap, we have seen how to opreating on params before we in ...

  4. (C++)字符串分割

    题目: 如何对C++中输入的字符串进行分割呢?如“I am a student”,去除空格后分割成为“I”,“am”, “a”, “student”四个单词 思路: 直接参考代码 代码: void s ...

  5. 海马模拟器连不上ADB的解决方法

    http://yunpan.cn/c3xMeYhvVsEIq  访问密码 fa8d先暂时用这个工具吧,官方提供的,不过目前不是最终版,后面会加入到模拟器中 adb connect 127.0.0.1: ...

  6. 线程:主线程、子线程 同步线程、异步线程 单线程、多线程 System.Threading与System.Windows.Threading

    入门-------------------------------------------------------------------------------- 概述与概念    一个C#程序开始 ...

  7. 牛客网-《剑指offer》-替换空格

    题目:http://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3e17650423 C++ class Solution { public: vo ...

  8. robot framework-databaselibaray库使用(python)

    公司做项目用到了databaselibaray,刚开始使用时碰到了很多问题,网上也查阅了很多资料终于是可以用了,现在整理记录下来,有需要的同学可随意使用: 另,本文主要是databaselibaray ...

  9. C++ 第十一课 标准c内存函数

    calloc() 分配一个二维储存空间 free() 释放已分配空间 malloc() 分配空间 realloc() 改变已分配空间的大小 calloc 语法:     #include <st ...

  10. Java 通配符匹配查找文件

    比较了一下Java正则表达式与通配符之间的差别,很简单的进行了一下转化就行了.此外要注意String的replace和replaceAll的用法的含义,不要搞错了. 字符串匹配例子 String s  ...