iOS保存接口返回枚举数据为本地json文件可用于测试

简介: iOS保存接口返回枚举数据为本地json文件可用于测试

前言

原文:

https://blog.csdn.net/z929118967/article/details/97629046

很多时候需要对接口返回的数据进行数据保存,以便下次使用。本地json文件的应用场景:

1、作为测试数据

2、避免频繁请求接口带来的数据延迟显示,提高性能(针对一些不长改变的数据,比如枚举、地区)

例子:保存接口/api/Dictionaries/GetDictionariesEnum(获取所有枚举字典数据)返回的字典数据为json文件,以便下次app启动时使用,来避免请求接口带来的数据延迟显示,提高性能。

1、先从内容获取数据NSMutableArray,

2、如果内容不存在,就从项目的本地文件进行读取searchEnum.json

3、登陆成功之后就请求接口更新DictionariesEnum 数据

image.png

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]

image.png

  • 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" : "商户风险控制--处理状态"
  },
  • 效果

image.png

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 其他应用场景效果图

image.png

  • 相关文章

iOS解决筛选视图的蒙蔽挡住视图的方案

【例子:筛选视图的蒙蔽挡住横屏电子签名界面的问题(横屏的时候才会重现)】

https://kunnan.blog.csdn.net/article/details/104838548


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

目录
相关文章
|
25天前
|
存储 测试技术 API
数据驱动开发软件测试脚本
今天刚提交了我的新作《带着ChatGPT玩转软件开发》给出版社,在写作期间跟着ChatGPT学到许多新知识。下面分享数据驱动开发软件测试脚本。
29 0
|
6月前
|
XML JSON API
如何在 Postman 中上传文件和 JSON 数据
如果你想在 Postman 中同时上传文件和 JSON 数据,本文将带你一步一步地了解整个过程,包括最佳实践和技巧,让你的工作更轻松。
|
9月前
|
分布式计算 Shell MaxCompute
odps测试表及大量数据构建测试
odps测试表及大量数据构建测试
|
8月前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
854 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
8月前
|
开发工具 git 索引
怎么取消对project.private.config.json这个文件的git记录
通过以上步骤,您可以成功取消对 `project.private.config.json`文件的Git记录。这样,文件将不会被包含在未来的提交中,同时仍保留在您的工作区中。
211 28
|
10月前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
118 11
|
10月前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
144 10
|
10月前
|
JSON API 数据格式
淘系等商品评论Json数据格式参考,API接口测试
通过以上示例和说明,你可以了解淘系商品评论的JSON数据结构和如何使用相关API接口获取评论数据。在实际操作中,你需要参考具体的API接口文档和开放平台的相关说明进行配置和调用。
|
11月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
356 6
|
11月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段。本文介绍了 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,强调了样本量、随机性和时间因素的重要性,并展示了 Python 在 A/B 测试中的具体应用实例。
252 1