Ios 项目从头开发 MVVM模式(三)

1.话说,本来想做个聚合查询功能,但是我的重点想研究xmpp聊天功能。所以使用mvvm模式做了完全模式51job主界面的页面。

2.首先给大家看我运行起来的界面。

3.界面很简单,做这个界面主要是为了比较mvvm模式和mvc模式之间的区别。

4.这个界面的结构是下边这张图片

与mvc相比,我多了一个viewmodel文件。

mvc之前是把业务逻辑和数据放在viewcontroller里边,逻辑复杂的话,别人维护起来很麻烦。

我就不贴viewcontroller的图片了,我把这个代码上传给大家,大家可以看看,和mvc相比,是不是很容易维护,代码层级会好一些。明天开始研究iosxmpp的聊天功能,所以会暂停一段时间更新。

没办法,看来只能贴代码了,我只贴viewcontroller和viewmodel的代码,大家可以比较下。

这是viewcontroller

#import <UIKit/UIKit.h>

@class MTSOnlineViewModel;

@interface MTSOnlineViewController :UITableViewController

@property(strong,nonatomic)MTSOnlineViewModel *onlineViewModel;

@end

#import "MTSOnlineViewController.h"

#import "MTSOnlineViewModel.h"

#import "MTSOnlineMenuCell.h"

@interface
MTSOnlineViewController()<MTSOnlineMenuDelegate>

@end

@implementation MTSOnlineViewController

#pragma mark - UIViewController Overrides

- (void)awakeFromNib

{

[superawakeFromNib];

}

- (void)viewDidLoad

{

[superviewDidLoad];

self.onlineViewModel=[[MTSOnlineViewModelalloc]
init];

[self.tableViewsetRowHeight:130.0f];

[self.tableViewsetSeparatorStyle:UITableViewCellSeparatorStyleNone];

@weakify(self);

[self.onlineViewModel.updatedContentSignalsubscribeNext:^(id
x) {

@strongify(self);

[self.tableViewreloadData];

}];

}

-(void)viewWillAppear:(BOOL)animated {

[superviewWillAppear:animated];

self.onlineViewModel.active =YES;

}

#pragma mark - Table View

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

return [self.onlineViewModelnumberOfItems];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath

{

MTSOnlineMenuCell *cell = [tableViewdequeueReusableCellWithIdentifier:@"onlinecell"forIndexPath:indexPath];

cell.selectionStyle=UITableViewCellSelectionStyleNone;

cell.delegate=self;

[cell configureCell:self.onlineViewModel.tableDataSourceindex:indexPath.row+1];

return cell;

}

#pragma mark --cell delegate

-(void)pressMenuButton:(MTSMenuType)type title:(NSString*)title;

{

[[[UIAlertViewalloc]
initWithTitle:@"按钮测试"message:title
delegate:nilcancelButtonTitle:@"确认"otherButtonTitles:nil,nil]
show];

}

@end

这是viewmodel

#import "RVMViewModel.h"

@interface MTSOnlineViewModel :RVMViewModel

@property (nonatomic,readonly)
RACSignal *updatedContentSignal;

@property (nonatomic,readonly)
NSMutableArray *tableDataSource;

-(NSInteger)numberOfItems;

@end

#import "MTSOnlineViewModel.h"

#import "MTSMenuModel.h"

@interface
MTSOnlineViewModel ()

@property (nonatomic,strong)
RACSubject *updatedContentSignal;

@property (nonatomic,strong)
NSMutableArray *tableDataSource;

@end

@implementation MTSOnlineViewModel

-(instancetype)init {

self = [superinit];

if (self ==nil)
returnnil;

self.updatedContentSignal = [[RACSubjectsubject]
setNameWithFormat:@"MTSOnlineViewModel updatedContentSignal"];

self.tableDataSource = [[NSMutableArrayalloc]
init];

@weakify(self)

[self.didBecomeActiveSignalsubscribeNext:^(id
x) {

@strongify(self);

[selfmenuDataSource];

}];

return
self;

}

#pragma mark - Public Methods

-(NSInteger)numberOfItems{

NSUInteger count = [self.tableDataSourcecount]/3;

return [self.tableDataSourcecount]%3==0?count:count+1;

}

-(void)menuDataSource{

[self.tableDataSourceaddObject:[[MTSMenuModelalloc]
init:@"职位搜索"imagePath:@"jobsearch.png"imagePressPath:@"jobsearch_press.png"type:JobSearch]];

[self.tableDataSourceaddObject:[[MTSMenuModelalloc]
init:@"校园招聘"imagePath:@"campus.png"imagePressPath:@"campus_press.png"type:Campus]];

[self.tableDataSourceaddObject:[[MTSMenuModelalloc]
init:@"职场资讯"imagePath:@"worknews.png"imagePressPath:@"worknews_press.png"type:WorkNews]];

[self.tableDataSourceaddObject:[[MTSMenuModelalloc]
init:@"企业粉丝团"imagePath:@"fans.png"imagePressPath:@"fans_focus.png"type:Fans]];

[self.tableDataSourceaddObject:[[MTSMenuModelalloc]
init:@"My 51job"imagePath:@"my51job.png"imagePressPath:@"my51job_focus.png"type:My51Job]];

[self.tableDataSourceaddObject:[[MTSMenuModelalloc]
init:@"简历中心"imagePath:@"resumecenter.png"imagePressPath:@"resumecenter_focus.png"type:Resumecenter]];

[self.tableDataSource addObject:[[MTSMenuModel alloc] init:@"薪酬咨询"
imagePath:@"salaryquery.png" imagePressPath:@"salaryquery_focus.png" type:Salaryquery]];

[self.tableDataSource addObject:[[MTSMenuModel alloc] init:@"申请记录"
imagePath:@"jobapply.png" imagePressPath:@"jobapply_focus.png" type:JobApply]];

[self.tableDataSource addObject:[[MTSMenuModel alloc] init:@"更多"
imagePath:@"themore.png" imagePressPath:@"themore_focus.png" type:TheMore]];

}

@end

时间: 2024-10-21 01:46:14

Ios 项目从头开发 MVVM模式(三)的相关文章

Ios 项目从头开发 MVVM模式(一)

1.之前的项目一直用mvc开发ios,发现ios有一个弊端,mvc里,viewcontroller里边有大量的业务逻辑,当不断的修改,会发现只是一个痛苦的过程. 2.之前做wpf,使用过mvvm模式,可以把业务逻辑放到vm模式,vm可以来处理业务逻辑.做过几个ios项目,也想过mvvm模式,但是一直没找到.偶尔看到网上有一个mvvm模式的ios项目,我来尝试从头开始做这个项目,做完之后源码会公开. 3.ok,这个mvvm开源的项目是C-41,有兴趣的可以去网上搜搜. 4.这个项目要关联到一些类

Ios 项目从头开发 MVVM模式(二)

1.这个项目昨天我想了下,有三大部分,第一部分是根据聚合进行在线数据的一个查询功能,第二部分是xmpp的聊天功能,第三部分是更多功能. 2.在线查询功能,主要用到的技术,就是get请求或者是post请求,这个在线查询功能,我们用到的是聚合的SDK,有自己的API,所以我们就需要单独的去做一些请求的类. 3.xmpp聊天功能,主要用到xmpp协议,框架我们用ios的XMPPFramework-master这个开源项目,详细的功能,我会再详细考虑. 4.更多功能,就是每一个app都会有的一些设置等功

[爱上Swift]第14弹:在iOS项目中引入MVVM

转自:http://www.cnblogs.com/sunshine-anycall/p/4153357.html 本文翻译自:http://www.objc.io/issue-13/mvvm.html.为了方便读者并节约时间,有些不是和文章主题相关的就去掉了.如果读者要看原文的话可以通过前面的url直接访问.作者也是做了iOS多年,从大学一直到现在n多年了.对于开发一款有B格的APP很有追求.学习了很多的东西,比如,silver bullet什么的,设计模式什么的.但是,面对急速膨胀的代码量,

在iOS项目中引入MVVM

本文翻译自:http://www.objc.io/issue-13/mvvm.html.为了方便读者并节约时间,有些不是和文章主题相关的就去掉了.如果读者要看原文的话可以通过前面的url直接访问.作者也是做了iOS多年,从大学一直到现在n多年了.对于开发一款有B格的APP很有追求.学习了很多的东西,比如,silver bullet什么的,设计模式什么的.但是,面对急速膨胀的代码量,即使才高八斗也显得无所适从.于是他开始思考人生... MVC?还有另外一个解释:Massive View Contr

IOS的MVC和MVVM模式简明介绍

iOS中的MVC(Model-View-Controller)将软件系统分为Model.View.Controller三部分,结构图如下: Model: 你的应用本质上是什么(但不是它的展示方式) Controller:你的Model怎样展示给用户(UI逻辑) View:用户看到的,被Controller操纵着的 Controller可以直接访问Model,也可以直接控制View. 但Model和View不能互相通信. View可以通过action-target的方式访问Controller,比

IOS项目之弹出动画三

前面写了弹出动画两个,今天做商城时又用到了,看着这个用着蛮普遍的,所以记了下来 // // mallMoreView.h // XQB // // Created by City--Online on 15/7/6. // // #import <UIKit/UIKit.h> typedef void (^SelectMallMoreMenu)(NSInteger index); @interface mallMoreView : UIView //单例 + (mallMoreView *)s

Swift开发iOS项目实战视频教程(一)---iOS真简单

本课主要介绍iOS项目的创建.第一个iOS项目的开发.UILabel.UIButton的使用. 假设你看完此视频还认为iOS非常难,请你来找我! 本教程摒弃枯燥的语法和知识解说,全是有趣有料的项目实战! 视频链接:v.youku.com/v_show/id_XNzI4NDQzNDIw.html 高清视频下载:pan.baidu.com/s/1ntHl79B 代码下载:pan.baidu.com/s/1bn3sKsZ swift交流群:307561190

MVVM 模式下iOS项目目录结构详细说明

?更多技术干货请戳:听云博客 我们在做项目的时候,会经常用到各种设计模式,最常见的要数 MVC (模型,视图,控制器)了.但是,今天我们要说的是另一种设计模式——MVVM. 所以 MVVM 到底是什么?下面,我们将结合代码,说明 MVVM 设计模式以及项目目录结构. 一.MVVM 模式介绍  MVVM 是 Model-View-View Model 的缩写,MVVM 听起来好像很复杂的样子,但它本质上就是MVC 的改进版.MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和

iOS开发中MVC、MVVM模式详解

iOS中的MVC(Model-View-Controller)将软件系统分为Model.View.Controller三部分 Model: 你的应用本质上是什么(但不是它的展示方式) Controller:你的Model怎样展示给用户(UI逻辑) View:用户看到的,被Controller操纵着的 Controller可以直接访问Model,也可以直接控制View. 但Model和View不能互相通信. View可以通过action-target的方式访问Controller,比如我们在Sto