IOS项目之分层MVVM
在做.Net時(shí),有用到三層架構(gòu),使項(xiàng)目分層。ios項(xiàng)目使用AFNetWork把網(wǎng)絡(luò)層這塊也放進(jìn)了ViewController中,數(shù)據(jù)解析緩存這些也在里面,這樣層次結(jié)構(gòu)可能不夠清楚,今天就試著分離了一下。
1.類結(jié)構(gòu)
首頁(yè)主要有三個(gè)部分組成,頂部的廣告,中部的圖標(biāo),和下部的一些單元格。設(shè)計(jì)了三個(gè)類,AdModel、IconModel、HomeFeedModel,參考MVVM同時(shí)設(shè)計(jì)了一個(gè)ViewModel,聲明了服務(wù)電話以及三個(gè)存儲(chǔ)上面類對(duì)象的數(shù)組。原以為將前面的三個(gè)類實(shí)現(xiàn)NSCoding協(xié)議就可以了沒想到ViewModel也要實(shí)現(xiàn)。
?
2.AFNetWorking分離
(1)遇到的問題
想著寫一個(gè)方法可以獲取請(qǐng)求數(shù)據(jù)的同時(shí)也能把錯(cuò)誤信息返回出來所以開始就寫了下面的代碼, 運(yùn)行發(fā)現(xiàn)msg、errmsg都是空,斷點(diǎn)之后發(fā)現(xiàn)AFNetWork請(qǐng)求部分是異步的,return之前還沒有給msg賦值,讓我很是糾結(jié), 這樣就沒有返回值。另block中修改外部變量要加__block
?
?
(2)解決
由于上面出現(xiàn)的問題,兩個(gè)類的傳值還是有問題,屬于有多個(gè)返回值,問了下小伙伴,說結(jié)構(gòu)有問題,需要用代理或者block,于是我又加了一個(gè)block,這下試了是可以的 @Class前置聲明
// // HomeModel.m // XQB // // Created by City--Online on 15/6/24. // //#import "HomeModel.h" #import "AdModel.h" #import "IconModel.h" #import "HomeFeed.h" #import "Global.h"@implementation HomeModel//NSCoding協(xié)議 -(void)encodeWithCoder:(NSCoder *)aCoder {[aCoder encodeObject:self.telPhone forKey:@"telPhone"];[aCoder encodeObject:self.adList forKey:@"adList"];[aCoder encodeObject:self.iconList forKey:@"iconList"];[aCoder encodeObject:self.homeFeedList forKey:@"homeFeedList"]; } - (instancetype)initWithCoder:(NSCoder *)coder {self = [super init];if (self) {_telPhone=[coder decodeObjectForKey:@"telPhone"];_adList=[coder decodeObjectForKey:@"adList"];_iconList=[coder decodeObjectForKey:@"iconList"];_homeFeedList=[coder decodeObjectForKey:@"homeFeedList"];}return self; }- (instancetype)init {self = [super init];if (self) {self.adList=[[NSMutableArray alloc]init];self.iconList=[[NSMutableArray alloc]init];self.homeFeedList=[[NSMutableArray alloc]init];}return self; } //網(wǎng)絡(luò)請(qǐng)求獲取數(shù)據(jù) -(void)GetHomeData {__block HomeModel *homeModel=[[HomeModel alloc]init];__block NSString *msg=[[NSString alloc]init];AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager shareManager];NSMutableDictionary *parameters = [[NSMutableDictionary alloc] initWithDictionary:[CommonParameters getCommonParameters]];[parameters addSignatureKey];[manager GET:API_HOME_URL parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {// XQBLog(@"\nresponseObject:%@", responseObject);if ([[responseObject objectForKey:XQB_NETWORK_ERROR_CODE] isEqualToString:XQB_NETWORK_ERROR_CODE_OK]) {NSMutableDictionary *dataDic = [responseObject objectForKey:@"data"];homeModel= [self transData:dataDic];msg=@"chenggong";_homeBlock(homeModel,nil);} else {//加載服務(wù)器異常界面homeModel=[self unArchiverData];msg=@"服務(wù)器異常";_homeBlock(homeModel,msg);}}failure:^(AFHTTPRequestOperation *operation, NSError *error) {//加載網(wǎng)絡(luò)異常界面msg=@"網(wǎng)絡(luò)異常";homeModel=[self unArchiverData];_homeBlock(homeModel,msg);}];return ; }-(HomeModel *)transData:(NSDictionary *)dic {HomeModel *homeModel=[[HomeModel alloc]init];NSString *telPhone = DealWithJSONValue([dic objectForKey:@"telephone"]);homeModel.telPhone=telPhone;NSArray *adArray = [dic objectForKey:@"ads"];for (NSDictionary *adInfo in adArray) {AdModel *adModel = [[AdModel alloc] init];adModel.adId = [[adInfo objectForKey:@"adId"] stringValue];adModel.imageUrl = DealWithJSONValue([adInfo objectForKey:@"image"]);adModel.link = DealWithJSONValue([adInfo objectForKey:@"link"]);adModel.title = DealWithJSONValue([adInfo objectForKey:@"title"]);[homeModel.adList addObject:adModel];}NSArray *homeIcons = [dic objectForKey:@"homeIcons"];for (NSDictionary *homeIconDic in homeIcons) {IconModel *item = [[IconModel alloc] init];item.title = [homeIconDic objectForKey:@"title"];item.icon = [homeIconDic objectForKey:@"icon"];item.linkUrl = [homeIconDic objectForKey:@"linkUrl"];item.type = [homeIconDic objectForKey:@"type"];item.createId = [[homeIconDic objectForKey:@"createId"] stringValue];item.iconId = [[homeIconDic objectForKey:@"id"] stringValue];item.category = [homeIconDic objectForKey:@"category"];[homeModel.iconList addObject:item];}NSArray *feedsDic = [dic objectForKey:@"feeds"];for (NSDictionary *feedDic in feedsDic) {HomeFeed *model = [[HomeFeed alloc] init];model.feedId = [[feedDic objectForKey:@"feedId"] stringValue];model.feedType = [feedDic objectForKey:@"feedType"];model.title = DealWithJSONValue([feedDic objectForKey:@"title"]);model.icon = DealWithJSONValue([feedDic objectForKey:@"icon"]);model.content = DealWithJSONValue([feedDic objectForKey:@"content"]);model.feedCity = [feedDic objectForKey:@"feedCity"];model.linkType = [feedDic objectForKey:@"linkType"];[homeModel.homeFeedList addObject:model];}[self savefile:homeModel];return homeModel; }//解檔 -(HomeModel *)unArchiverData {NSMutableData *mutableData=[[NSMutableData alloc]initWithContentsOfFile:[self filePath]];NSKeyedUnarchiver *unarchiver=[[NSKeyedUnarchiver alloc]initForReadingWithData:mutableData];HomeModel *model=[unarchiver decodeObjectForKey:@"homeModel"]; // NSLog(@"%@ %@",model.telPhone,model.adList); // for (IconModel *admodel in model.iconList) { // NSLog(@"%@",admodel.title); // }return model; } //歸檔 -(void)savefile:(HomeModel *)model {NSMutableData *mutableData=[[NSMutableData alloc]init];NSKeyedArchiver *archiver=[[NSKeyedArchiver alloc]initForWritingWithMutableData:mutableData];[archiver encodeObject:model forKey:@"homeModel"];[archiver finishEncoding];[mutableData writeToFile:[self filePath] atomically:YES];} //獲取文件路徑 -(NSString *)filePath {NSArray *documents=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *documentpath=[documents firstObject];NSString *filePath=[documentpath stringByAppendingPathComponent:@"home"];return filePath; } @end
?
這樣就能實(shí)現(xiàn)網(wǎng)絡(luò)和ViewController的分離了,再往下可以將業(yè)務(wù)邏輯和網(wǎng)絡(luò)層再分離,項(xiàng)目不大,這里就沒有細(xì)分
總結(jié)
以上是生活随笔為你收集整理的IOS项目之分层MVVM的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 移动端 页面跳转的方赞
- 下一篇: Linux 搜索指令