日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

IOS项目之分层MVVM

發(fā)布時(shí)間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOS项目之分层MVVM 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在做.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前置聲明


#import <Foundation/Foundation.h> @class HomeModel; typedef void(^homeModelBlock) (HomeModel *model,NSString *errmsg); @interface HomeModel : NSObject @property(nonatomic,strong) NSString *telPhone; @property(nonatomic,strong) NSMutableArray *adList; @property(nonatomic,strong) NSMutableArray *iconList; @property(nonatomic,strong) NSMutableArray *homeFeedList; @property(nonatomic,copy) homeModelBlock homeBlock;-(void)GetHomeData;@end

// // 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91新视频 | 97人妻精品一区二区三区 | 欧美国产大片 | 黄色一级免费观看 | 日韩在线播放av | 色四月| 欧美激情亚洲激情 | 久久一级片 | 色婷婷亚洲综合 | 91视频网| 色综合成人 | 男人天堂2021 | 国产在线观看免费视频软件 | 97国产精品视频人人做人人爱 | 美女毛片在线观看 | 少妇一晚三次一区二区三区 | 亚洲一区二区三区久久久 | av在线天堂网 | 午夜激情网址 | 免费人成年激情视频在线观看 | 日韩成人在线观看视频 | 国产av无码专区亚洲精品 | 91福利影院| 欧美久久视频 | av黄色av | 男同互操gay射视频在线看 | 最近最新中文字幕 | 肉丝美脚视频一区二区 | 香蕉视频一区二区三区 | 欧美久久久久久久 | 国产一级片一区二区 | 一区二区三区www污污污网站 | 美女黄视频在线观看 | 国产精品久久视频 | 熟妇五十路六十路息与子 | 国产在线看黄 | 涩涩涩涩涩涩涩涩涩 | 成人在线视频一区二区三区 | 国产精品资源站 | 欧美影院| 欧美伊人| 亚洲欧洲av在线 | 亚洲性一区| 风间由美av在线 | 中文字幕欧美日韩 | 丰满人妻一区二区三区四区53 | 亚洲一区二区欧美 | 精品少妇人妻av一区二区 | 最新毛片基地 | 成人免费在线 | 四虎成人精品永久免费av | 亚洲高清免费 | 污视频网站免费 | 午夜综合网 | 成人精品视频在线观看 | 姐姐的秘密韩剧免费观看全集中文 | 免费极品av一视觉盛宴 | 麻豆视频在线播放 | 日本韩国欧美 | 不良视频在线观看 | 91精品国产高潮对白 | 最近免费中文字幕中文高清百度 | 4438x亚洲| 爱爱中文字幕 | 91嫩草影视 | 玖玖热视频 | 久草青青| 男男免费视频 | 国产真实乱人偷精品人妻 | 亚洲毛片a| 国产精品久久久免费观看 | 久久av网站 | 91亚洲视频 | 亚洲国产私拍精品国模在线观看 | 岛国片免费在线观看 | 在线免费看a | 国产人妻人伦精品1国产丝袜 | 福利视频免费看 | 欧美超碰在线观看 | 97免费视频观看 | 动漫美女视频 | 三上悠亚在线一区二区 | 久久成人亚洲 | 色吧av色av| 国产精品视频一区二区在线观看 | 午夜性刺激免费视频 | 18成人免费观看网站 | 天天摸日日 | 欧美成人免费网站 | 91av导航 | 欧美人体视频一区二区三区 | 黄色录像a级片 | 九色91popny蝌蚪新疆 | 日本美女高潮 | 国产精品久久久久久久免费观看 | 欧美区二区三区 | 日韩无码电影 | 粉嫩一区 | 四虎国产在线 |