IOS项目之分层MVVM
生活随笔
收集整理的這篇文章主要介紹了
IOS项目之分层MVVM
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在做.Net時,有用到三層架構,使項目分層。ios項目使用AFNetWork把網絡層這塊也放進了ViewController中,數據解析緩存這些也在里面,這樣層次結構可能不夠清楚,今天就試著分離了一下。
1.類結構
首頁主要有三個部分組成,頂部的廣告,中部的圖標,和下部的一些單元格。設計了三個類,AdModel、IconModel、HomeFeedModel,參考MVVM同時設計了一個ViewModel,聲明了服務電話以及三個存儲上面類對象的數組。原以為將前面的三個類實現NSCoding協議就可以了沒想到ViewModel也要實現。
?
2.AFNetWorking分離
(1)遇到的問題
想著寫一個方法可以獲取請求數據的同時也能把錯誤信息返回出來所以開始就寫了下面的代碼, 運行發現msg、errmsg都是空,斷點之后發現AFNetWork請求部分是異步的,return之前還沒有給msg賦值,讓我很是糾結, 這樣就沒有返回值。另block中修改外部變量要加__block
?
?
(2)解決
由于上面出現的問題,兩個類的傳值還是有問題,屬于有多個返回值,問了下小伙伴,說結構有問題,需要用代理或者block,于是我又加了一個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協議 -(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; } //網絡請求獲取數據 -(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 {//加載服務器異常界面homeModel=[self unArchiverData];msg=@"服務器異常";_homeBlock(homeModel,msg);}}failure:^(AFHTTPRequestOperation *operation, NSError *error) {//加載網絡異常界面msg=@"網絡異常";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
?
這樣就能實現網絡和ViewController的分離了,再往下可以將業務邏輯和網絡層再分離,項目不大,這里就沒有細分
總結
以上是生活随笔為你收集整理的IOS项目之分层MVVM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 移动端 页面跳转的方赞
- 下一篇: Thrift之Protocol源码分析