前言
原文:
很多时候需要对接口返回的数据进行数据保存,以便下次使用。本地json文件的应用场景:
1、作为测试数据
2、避免频繁请求接口带来的数据延迟显示,提高性能(针对一些不长改变的数据,比如枚举、地区)
例子:保存接口
/api/Dictionaries/GetDictionariesEnum(获取所有枚举字典数据)返回的字典数据为json文件,以便下次app启动时使用,来避免请求接口带来的数据延迟显示,提高性能。
1、先从内容获取数据NSMutableArray,
2、如果内容不存在,就从项目的本地文件进行读取searchEnum.json
3、登陆成功之后就请求接口更新DictionariesEnum 数据
I、数组转json 字符串的应用案例
po [[NSString alloc] initWithData: [NSJSONSerialization dataWithJSONObject:tmp options:NSJSONWritingPrettyPrinted error:nil] encoding:NSUTF8StringEncoding]
案例:保存接口/api/Dictionaries/GetDictionariesEnum
返回的字典数据为json文件,以便下次使用,来提交性能。
1.1 保存接口返回的数据 ,以便下次使用,来提交性能
保存接口/api/Dictionaries/GetDictionariesEnum
返回的字典数据为json文件,以便下次使用,来提交性能。
1、先从内容获取数据NSMutableArray,
2、如果内容不存在,就从项目的本地文件进行读取searchEnum.json
3、登陆成功之后就请求接口更新DictionariesEnum 数据
- 进入首页更新接口数据
+ (void)jumpHome{ [ UserInfoModel.shareUserInfoModel setupinitInfo]; [[UIApplication sharedApplication].keyWindow switchRootViewController]; } /** 解析本地json文件数据到内容 更新接口数据到本地json文件 */ - (void) setupinitInfo{ [self CurrentUserStatus]; [self GetCurrentSysUser]; [self DictionariesEnum];// 解析本地json文件数据到内存 [self GetDictionariesEnum];// 更新接口数据到本地json文件 [QCTAreaListTool getAreaList]; }
- 提供获取数据NSMutableArray方法
解析本地json文件数据到内存
/** /api/Dictionaries/GetDictionariesEnum >解析本地json文件数据到内存 @return NSMutableArray */ - (NSMutableArray *)DictionariesEnum{ if (_DictionariesEnum == nil) { // 先从文件searchEnum.json获取。 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"searchEnum.json" ofType:nil]; NSData *data = [NSData dataWithContentsOfFile:filePath];//获取指定路径的data文件 id json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; //获取到json文件的跟数据(字典) _DictionariesEnum= [QCTDictionariesEnum mj_objectArrayWithKeyValuesArray:json]; [self setupGetDictionariesEnum:_DictionariesEnum]; } return _DictionariesEnum; }
- 更新接口数据到本地json文件
/** 更新接口数据到本地json文件 */ - (void) GetDictionariesEnum{ NSString *getURL = k_API_Dictionaries_GetDictionariesEnum; NSMutableDictionary *params = [NSMutableDictionary dictionary]; __weak __typeof__(self) weakSelf = self; [QCTNetworkHelper GET:getURL parameters:params success:^(id _Nonnull responseObj) { NSArray *tmpdic = responseObj[@"data"]; if(tmpdic.count >0){ // 保存数据到json NSString *filePath = [[NSBundle mainBundle] pathForResource:@"searchEnum.json" ofType:nil]; NSData *json_data = [NSJSONSerialization dataWithJSONObject:tmpdic options:NSJSONWritingPrettyPrinted error:nil]; [json_data writeToFile:filePath atomically:YES]; }else{ return ; } // 更新内存对象数据 [weakSelf setupGetDictionariesEnum:[QCTDictionariesEnum mj_objectArrayWithKeyValuesArray:tmpdic]]; } failure:nil bizFailure:nil isShowLoadingDataGif:NO]; } ///api/SysUser/GetCurrentSysUser
1.2 发布新版本时定期更新本地json文件
- 打断点获取数据
"data" : [ { "keyName" : "EAnnouncementShowType", "data" : [ { "value" : 1, "text" : "弹窗通知(含公告中心展示)" }, { "value" : 2, "text" : "公告中心展示" } ], "description" : "展示方式" },
- 进入LLDB进行json 数据的获取
po [[NSString alloc] initWithData: [NSJSONSerialization dataWithJSONObject:tmpdic options:NSJSONWritingPrettyPrinted error:nil] encoding:NSUTF8StringEncoding]
- copy 控制台的json 数据覆盖本地json数据即可
1.3 利用接口返回的枚举动态地控制列表数据的筛选
- ERiskState 风险商户列表的处理状态
{ "keyName" : "ERiskState", "data" : [ { "value" : 1, "text" : "待处理" }, { "value" : 2, "text" : "待审核" }, { "value" : 3, "text" : "审核驳回" }, { "value" : 4, "text" : "已超时" }, { "value" : 5, "text" : "审核完成(解除管控)" } ], "description" : "商户风险控制--处理状态" },
- 效果
1.3.1 初始化列表表头数据
@interface CRMRisk_merchant_List_VM : NSObject /** 存储ERiskState对应的数据 */ @property (nonatomic, strong) NSMutableArray<QCTkeyValueModel*> *RiskStates; /** 列表表头的标题数组,即状态描述 */ @property (nonatomic, strong) NSArray <NSString *> *titles;
- (NSArray<NSString *> *)getRandomTitles{ //ERiskState NSMutableArray *titles = [NSMutableArray array]; for (QCTkeyValueModel *m in self.RiskStates) { [titles addObject: m.text]; } return titles; // NSMutableArray *titles1 = @[ // QCTLocal(@"待处理"), // QCTLocal(@"审核中"), // QCTLocal(@"审核驳回"), // QCTLocal(@"已完成"), // // ]; // }
1.3.2 核心代码
请求数据的时候,根据状态的下表,或者对应的状态描述,再根据状态描述利用
NSPredicate
查找对应的枚举值
- 设置RiskState参数
NSString *tmpRiskState = nil; if(self.viewModel.titles.count> self.index){ tmpRiskState = [self.viewModel getRiskStateValueWithtext:self.viewModel.titles[self.index]]; } if(![NSStringQCTtoll isBlankString:tmpRiskState]){ [params setValue:tmpRiskState forKey:@"RiskState"]; }
- 根据对应的状态描述,再根据状态描述利用
NSPredicate
查找对应的枚举值
- (NSString *)getRiskStateValueWithtext:(NSString *)text{ if(self.RiskStates.count<=0){ return nil; } NSPredicate* predicate = [NSPredicate predicateWithFormat:@"text == %@", text]; NSArray *arFiltered = [ self.RiskStates filteredArrayUsingPredicate:predicate];// QCTkeyValueModel *dto = nil; if(arFiltered.count>0){ dto = arFiltered.firstObject; } return dto.value; //———————————————— //版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 //原文链接:https://blog.csdn.net/z929118967/article/details/113499172 }
1.3.3 其他应用场景效果图
- 相关文章
iOS解决筛选视图的蒙蔽挡住视图的方案
【例子:筛选视图的蒙蔽挡住横屏电子签名界面的问题(横屏的时候才会重现)】
https://kunnan.blog.csdn.net/article/details/104838548