iOS开发之利用MVVM框架来优化项目结构。对Controller瘦身以及MVC向MVVM框架的迁移。
来源:互联网 发布:海辉软件 国际 集团 编辑:程序博客网 时间:2024/06/07 23:56
MVC开发模式 :
1. 苹果官方一直推荐我们开发者使用MVC的开发模式,所以我们大部分人之前的项目都是用MVC来开发APP,这样开发,肯定会发现一个超级大的弊端,viewcontroller里边有大量的业务逻辑与视图操作逻辑,随着项目的不断的迭代,会充斥着大量的问题,我们的单元测试也好, 我们的逻辑设计,以及代码的整洁性,代码的层级性都会出现很多的问题,为此我觉得为Controller瘦身已经是非常必要的。 也有一部分开发者着不同意这种思想,但是我们也不必固守成规,虽然MVVM想必与MVC可能从代码上来讲并没有减少,反而可能增加。 但是相对应的,也会带来很多好处,下面就是MVVM 使用后的一些优点。
MVVM的优点如下:
MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有以下四大优点1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。
4. 可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。
下面通过代码来进行来进行说明
1.首先项目的层级关系图。
1.model文件夹: 这个和mvc下的model没有什么区别。 一般为瘦model.
2. view文件夹: 视图的载体, 和mvc下的view也没有什么区别, 由controller进行协调展示。
3. Controller文件夹 : 只包含一些视图的操作,不包含任何的业务处理。这里要达到瘦身的效果,经常会吧tableview 的protocal给单独提出来,本文章将的也会把这些类给提出来,后面详细说明
4.ViewModel: 把以前充斥在Controller中的一些业务处理放置在此地, 包含:数据请求,数据的包装。把封装好的数据直接传递给Controller直接进行显示。 网络请求的起飞与着陆点,这个看项目的网络层架构设计。 不能一视同仁
5.TableViewProtocol文件夹: 这个就是把Tableview的数据源与delegate给提取出来,这样做的好处就是可以最大化的重用对应的代理方法,易于管理, 并且可以让controller中及其的简洁。
6.3rdLibs文件夹: 存放了一个第三方的上下拉加载控件。
2.完整的项目代码结构目录:
下面让我们一级一级的进行代码的解剖:
1.Controller代码解剖:
TableViewController.h
#import <UIKit/UIKit.h>@interface TableViewController : UIViewController@end
TableViewController.m
#import "TableViewController.h"#import "YiRefreshHeader.h"#import "YiRefreshFooter.h"#import "TableViewModel.h"#import "TableViewDataSource.h"#import "TableViewDelegate.h"@interface TableViewController (){ YiRefreshHeader *refreshHeader; YiRefreshFooter *refreshFooter; NSMutableArray *totalSource; TableViewModel *tableViewModel; UITableView *tableView; TableViewDataSource *tableViewDataSource; TableViewDelegate *tableViewDelegate;}@end@implementation TableViewController- (void)viewDidLoad{ [super viewDidLoad]; // Do any additional setup after loading the view. if (iOS7) { self.edgesForExtendedLayout = UIRectEdgeBottom | UIRectEdgeLeft | UIRectEdgeRight; } self.title=@"MVVMDemo With TableView"; self.view.backgroundColor=[UIColor whiteColor]; tableView=[[UITableView alloc] initWithFrame:CGRectMake(0, 0, WScreen, HScreen-64) style:UITableViewStylePlain]; [self.view addSubview:tableView]; tableViewDataSource = [[TableViewDataSource alloc] init]; //对tableview 数据源的封装的类 tableViewDelegate = [[TableViewDelegate alloc] init]; //对tableview 代理 封装的类,可以方便复用 tableView.dataSource=tableViewDataSource; //把当前的tableview的数据源指向我们的公用datasource类。 tableView.delegate=tableViewDelegate; //把当前的tableview的代理指向我们的公用的代理类。 tableViewModel=[[TableViewModel alloc] init]; //本章的重头戏,把业务处理提出的类 totalSource=0; // YiRefreshHeader 头部刷新按钮的使用 refreshHeader=[[YiRefreshHeader alloc] init]; refreshHeader.scrollView=tableView; [refreshHeader header]; __weak typeof(self) weakSelf = self; refreshHeader.beginRefreshingBlock=^(){ __strong typeof(self) strongSelf = weakSelf; [strongSelf headerRefreshAction]; //下拉刷新 }; // 是否在进入该界面的时候就开始进入刷新状态 [refreshHeader beginRefreshing]; // YiRefreshFooter 底部刷新按钮的使用 refreshFooter=[[YiRefreshFooter alloc] init]; refreshFooter.scrollView=tableView; [refreshFooter footer]; refreshFooter.beginRefreshingBlock=^(){ __strong typeof(self) strongSelf = weakSelf; [strongSelf footerRefreshAction]; //上拉刷新 }; }// 这里是具体的下拉刷新方法,我们可以发现,这里是调用了viewModel中的方法,并把处理的结果通过block方式返回回来。- (void)headerRefreshAction{ [tableViewModel headerRefreshRequestWithCallback:^(NSArray *array){ totalSource=(NSMutableArray *)array; tableViewDataSource.array=totalSource; tableViewDelegate.array=totalSource; [refreshHeader endRefreshing]; [tableView reloadData]; }];}// 这里是具体的上拉刷新方法,我们可以发现,这里是调用了viewModel中的方法,并把处理的结果通过block方式返回回来。- (void)footerRefreshAction{ [tableViewModel footerRefreshRequestWithCallback:^(NSArray *array){ [totalSource addObjectsFromArray:array] ; tableViewDataSource.array=totalSource; tableViewDelegate.array=totalSource; [refreshFooter endRefreshing]; [tableView reloadData]; }]; }
- iOS开发之利用MVVM框架来优化项目结构。对Controller瘦身以及MVC向MVVM框架的迁移。
- iOS开发之利用MVVM框架来优化项目结构。对Controller瘦身以及MVC向MVVM框架的迁移。
- 开发框架 MVC MVP MVVM
- iOS MVVM 框架设计 和 MVC 框架
- MVC、MVP以及MVVM框架简要介绍
- MVC+avalon MVVM框架
- 个人对mvc mvvm的理解---代码结构 IOS
- Swift教程17-淡化MVC,使用MVVM框架开发轻巧便于维护的iOS app
- [iOS]MVVM-框架介绍
- [iOS]MVVM-框架介绍
- iOS mvvm 框架设计
- iOS-MVVM-框架介绍
- iOS-MVVM-框架介绍
- iOS-MVVM-框架介绍
- reactivecocoa框架 、MVC 和 MVVM 的理解
- 菜鸟iOS 开发之MVC MVVM ReactiveCocoa
- MVC、MVP、MVVM框架模式
- MVC,MVP,MVVM框架剖析
- make: 警告:检测到时钟错误。您的创建可能是不完整的。
- JS---小技巧总结
- ROS与boost::bind( )
- shell脚本备份mysql和项目数据
- 用Android Studio进行内存分析调试
- iOS开发之利用MVVM框架来优化项目结构。对Controller瘦身以及MVC向MVVM框架的迁移。
- ADAS 详解
- 百度URL API实现地址 经纬度互相转换
- 内部类(总结版)
- kernel中各种initcall的优先级
- opencv编译中下载opencv_ffmpeg.dll和ippicv出错的相关办法
- 地区选择
- vc+如何实现模拟键盘输入,自动输入文字(创世纪篇)
- 软考网络工程师