日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 97福利视频 | 国产精品色呦呦 | 麻豆影视av| 国产一区二区黑人欧美xxxx | 干老太太视频 | 中文字幕免费在线观看 | 亚洲av成人精品一区二区三区 | www.久久伊人 | 国产精品国产三级国产播12软件 | 顶级毛片| 久久精品无码一区二区三区 | 午夜激情福利电影 | 日韩网站视频 | 国产黄色影院 | 亚洲红桃视频 | 在线一区二区三区四区五区 | 日韩在线观看不卡 | 4438x亚洲最大 | 少妇被躁爽到高潮无码人狍大战 | 国产精品腿扒开做爽爽爽挤奶网站 | 黄色av国产| 他揉捏她两乳不停呻吟动态图 | 成人av日韩 | 国产黄色一级片视频 | 国产一区二区三区在线观看视频 | 久久久.www | 国产偷亚洲偷欧美偷精品 | 天天操天天干天天摸 | 国产精品成人免费看片 | 国产视频精品视频 | 无码人妻aⅴ一区二区三区有奶水 | 日韩欧美的一区二区 | 中文字幕第315页 | av成人在线电影 | 亚洲第一视频网 | av55 | 免费高清av在线看 | 国产高清sp | 亚洲成人免费在线视频 | 男女啪啪国产 | 色综合久久88色综合天天免费 | 欧美日韩不卡视频 | 黄色成人在线视频 | av一卡二卡 | 国产精品高潮av | 丁香亚洲| 久久女人天堂 | 欧美三级视频 | 男人天堂五月天 | 成人性生交大片免费看vrv66 | 欧美日韩在线视频免费观看 | 黄色av中文字幕 | 亚洲韩国精品 | 91看片免费版 | 福利在线一区二区三区 | 久久天天躁狠狠躁夜夜av | 黄色网av | 人人色网 | 深夜福利视频在线 | 中国男人操女人 | 欧美成人生活片 | 免费观看av网站 | 免费黄色资源 | 成人高清在线观看 | 蜜桃久久久aaaa成人网一区 | 国产午夜伦理 | 免费视频二区 | 国产区一二三 | 国产精品福利在线播放 | 久久亚洲综合国产精品99麻豆精品福利 | 先锋影音制服丝袜 | 五月天中文字幕mv在线 | 黄色大片一级片 | 又黄又爽又色视频 | 国产精品久久在线观看 | 日韩国产小视频 | 污视频网站入口 | 国产aa视频| 黑人操日本 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲熟女一区二区三区 | 日韩av片在线播放 | 人人射视频 | 免费国产黄色 | 96亚洲精品久久久蜜桃 | www.色国产 | 亚洲一二三区视频 | 国产日产欧洲无码视频 | 国产夫妻自拍小视频 | 国产精品乱码 | 五十路在线视频 | xxxx久久 | 亚洲精品视频久久 | 尤物视频在线观看视频 | 亚洲精品嫩草 | 久久午夜夜伦鲁鲁片无码免费 | 精品美女在线 | 欧美日韩欧美日韩在线观看视频 | 亚洲第一成人网站 | 苍井空浴缸大战猛男120分钟 |