“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 23 天,点击查看活动详情”
前言
很多时候需要对接口返回的数据进行数据保存,以便下次使用。 本地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 *path = [[NSBundle mainBundle] pathForResource:@"searchEnum.json" ofType:nil];
// NSArray *array = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:path] options:NSJSONReadingMutableLeaves error:nil];
// NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"/searchEnum.json"];//获取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
//searchEnum.json
// (lldb) po [[NSString alloc] initWithData: [NSJSONSerialization dataWithJSONObject:tmp options:NSJSONWritingPrettyPrinted error:nil] encoding:NSUTF8StringEncoding]
// BOOL boo= [tmp writeToFile:@"/Users/mac/Desktop/city.plist" atomically:YES];
// NSString *path = [[NSBundle mainBundle] pathForResource:@"city.json" ofType:nil];
// NSString *filePath = @"/Users/mac/Desktop/searchEnum.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解决筛选视图的蒙蔽挡住视图的方案【例子:筛选视图的蒙蔽挡住横屏电子签名界面的问题(横屏的时候才会重现)】 kunnan.blog.csdn.net/article/det…
II json 转数组
NSString *path = [[NSBundle mainBundle] pathForResource:@"city.json" ofType:nil];
NSArray *array = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:path] options:NSJSONReadingMutableLeaves error:nil];
III see also
更多内容请关注gzh:iOS逆向
3.1 swift4.0 ios tableView去掉没有数据部分多余Cell的分隔线
self.tblVehicle.separatorColor = themeColor
//swift4.0 ios tableView去掉没有数据部分多余Cell的分隔线
//去掉没有数据显示部分多余的分隔线
tblVehicle.tableFooterView = UIView.init(frame: CGRect.zero)
//将分隔线offset设为零,即将分割线拉满屏幕
tblVehicle.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
3.2 swift UIAlertController的使用方法
if self.arrData.count<1 {
let alertController = UIAlertController(title: "", message:
"No parked data found", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: .default))
self.present(alertController, animated: true, completion: nil)
}
- 格式校验 www.sojson.com