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转化之后的数据item由viewModel保存,与数据相关的处理都将在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. Python实现爬虫设置代理IP和伪装成浏览器的方法(转载)

    https://www.jb51.net/article/139587.htm chrome_options = webdriver.ChromeOptions() chrome_options.ad ...

  2. java根据图片路径下载到服务器方案 (转)

    http://www.cnblogs.com/thinkingandworkinghard/articles/5589484.html 平常做的工作中,有一部分是同步数据的.但是同步的过程中碰到个问题 ...

  3. Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系Android OpenGL ES篇(转帖)

      来自:http://www.cnblogs.com/xiaobo68688/archive/2011/12/01/2269985.html   首先我们在屏幕中心显示一个矩形,效果如图: // 代 ...

  4. Eclipse使用hibernate插件

    首先安装好hibernate插件,进入安装界面,输入下载地址http://download.jboss.org/jbosside/updates/stable,点击下载javaee web 以下的hi ...

  5. 微信、支付宝App支付-JPay0.0.2发布

    JPay 对微信App支付.支付宝App支付的二次封装,对外提供一个相对简单的接口以及支付结果的回调 GitHub:https://github.com/Javen205/JPay OsChina:h ...

  6. 【python】理想论坛爬虫1.08

    #------------------------------------------------------------------------------------ # 理想论坛爬虫1.08, ...

  7. [置顶] 单例模式lua实现

    --[[ 优点 一.实例控制 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例. 二.灵活性 因为类控制了实例化过程,所以类可以灵活更改实例化过程. 缺点 一.开销 ...

  8. HDS Truecopy实现原理及项目的选择-诸多案例

    copy from:http://www.eygle.com/archives/2009/05/hds_truecopy_dataguard.html 诸多案例:http://wenku.baidu. ...

  9. Eclipse远程连接Hadoop

    Windows下面调试程序比在Linux下面调试方便一些,于是用Windows下的Eclipse远程连接Hadoop. 1. 下载相应版本的hadoop-eclipse-plugin插件,复制到ecl ...

  10. Webview跨域访问风险

    漏洞原理:WebView对象的行为是通过WebSettings类进行设置的,如果配置不当,攻击者就可以利用该漏洞可以打破Android沙盒隔离机制,从而通过某个应用来攻击其它应用,盗取其它应用本地保存 ...