【iOS】YYModel的初步学习

news2024/11/24 14:24:05

YYModel的初步学习

文章目录

  • YYModel的初步学习
    • 前言
    • 与JSONModel对比
    • YYModel的优势
    • 如何使用YYModel
      • 最简单的Model形式
      • 容器类属性
      • 白名单和黑名单
      • Model的嵌套
    • 小结

前言

随着时代的发展,iOS解析JSON数据的第三方库越来越多,原先的JSONModel的性能上的问题逐渐显现,现在我们可以采用更加高效的第三方库YYModel。

与JSONModel对比

时间消耗(在 iPhone 6 上处理 GithubUser 10000 次):

在这里插入图片描述

这里我们可以看出YYModel的性能其实超过了JSONModel,笔者在下文中仅仅介绍对于YYModel的使用,至于他与JSONModel的源码笔者会之后再进行学习。

YYModel的优势

  • 高性能:转换性能接近手写代码。
  • 自动类型转换:对象类型可以自动转换。
  • 类型安全:将验证所有数据类型以确保在转换过程中类型安全。
  • 非侵入式:无需使模型类继承其他基类。
  • 轻量化:此库仅包含 5 个文件。
  • 文档和单元测试:100% 的文档覆盖率,99.6% 的代码覆盖率。

如何使用YYModel

最简单的Model形式

// JSON:
{
    "uid":123456,
    "name":"Harry",
    "created":"1965-07-31T00:00:00+0000"
}

// Model:
@interface User : NSObject
@property UInt64 uid;
@property NSString *name;
@property NSDate *created;
@end
@implementation User
@end


// Convert json to model:
User *user = [User yy_modelWithJSON:json];

// Convert model to json:
NSDictionary *json = [user yy_modelToJSONObject];

我们使用YYModel的时候,只需要按照JSON数据中的名字,然后创建一个对象中设置属性名字和JSON数据中相同,然后我们需要在网络请求中调用yy_modelWithJSONyy_modelToJSONObject这两个方法。一个是将JSON转化成model数据,另一个则是将model数据转化成NSObject这两个类。

这里我们简单将这段代码放在网络请求中:

-(void)dataLoad {
    NSString* urlString = @"https://devapi.qweather.com/v7/weather/3d?location=101010100&key=2211750bdc834763ba3c5f57ce98c307";
    //NSURL* url = [NSURL URLWithString:urlString];
    [[AFHTTPSessionManager manager] GET:urlString parameters:nil headers:nil progress:^(NSProgress * _Nonnull downloadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        tryModel* model = [tryModel yy_modelWithJSON:responseObject];
        NSDictionary* dirty = [model yy_modelToJSONObject];
        NSLog(@"%@", dirty);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error");
    }];
}

我们只需要简单结合网络请求和YYModel便可以实现对于JSON数据的一个解析,这里笔者采用了之前用过的和风天气的api

容器类属性

这里先给出我们这里的JSON数据:

{
  "code": "200",
  "updateTime": "2024-10-08T20:18+08:00",
  "fxLink": "https://www.qweather.com/weather/beijing-101010100.html",
  "daily": [
    {
      "fxDate": "2024-10-08",
      "sunrise": "06:18",
      "sunset": "17:47",
      "moonrise": "11:40",
      "moonset": "20:33",
      "moonPhase": "蛾眉月",
      "moonPhaseIcon": "801",
      "tempMax": "23",
      "tempMin": "10",
      "iconDay": "100",
      "textDay": "晴",
      "iconNight": "151",
      "textNight": "多云",
      "wind360Day": "180",
      "windDirDay": "南风",
      "windScaleDay": "1-3",
      "windSpeedDay": "3",
      "wind360Night": "180",
      "windDirNight": "南风",
      "windScaleNight": "1-3",
      "windSpeedNight": "3",
      "humidity": "64",
      "precip": "0.0",
      "pressure": "1010",
      "vis": "25",
      "cloud": "25",
      "uvIndex": "4"
    },
    {
      "fxDate": "2024-10-09",
      "sunrise": "06:19",
      "sunset": "17:46",
      "moonrise": "12:41",
      "moonset": "21:28",
      "moonPhase": "蛾眉月",
      "moonPhaseIcon": "801",
      "tempMax": "20",
      "tempMin": "11",
      "iconDay": "305",
      "textDay": "小雨",
      "iconNight": "151",
      "textNight": "多云",
      "wind360Day": "90",
      "windDirDay": "东风",
      "windScaleDay": "1-3",
      "windSpeedDay": "3",
      "wind360Night": "0",
      "windDirNight": "北风",
      "windScaleNight": "1-3",
      "windSpeedNight": "16",
      "humidity": "24",
      "precip": "1.0",
      "pressure": "1012",
      "vis": "24",
      "cloud": "55",
      "uvIndex": "3"
    },
    {
      "fxDate": "2024-10-10",
      "sunrise": "06:20",
      "sunset": "17:44",
      "moonrise": "13:36",
      "moonset": "22:32",
      "moonPhase": "上弦月",
      "moonPhaseIcon": "802",
      "tempMax": "21",
      "tempMin": "7",
      "iconDay": "100",
      "textDay": "晴",
      "iconNight": "150",
      "textNight": "晴",
      "wind360Day": "0",
      "windDirDay": "北风",
      "windScaleDay": "1-3",
      "windSpeedDay": "3",
      "wind360Night": "225",
      "windDirNight": "西南风",
      "windScaleNight": "1-3",
      "windSpeedNight": "3",
      "humidity": "42",
      "precip": "0.0",
      "pressure": "1010",
      "vis": "25",
      "cloud": "25",
      "uvIndex": "4"
    }
  ],
  "refer": {
    "sources": [
      "QWeather"
    ],
    "license": [
      "CC BY-SA 4.0"
    ]
  }
}

这里我们可以看到这里的daily里面包含了一个数组,而那个数组里面有包含了另一个Model。所以说这里的JSON数据包含了一个容器类的属性,这里我们需要调用一下+ (NSDictionary *)modelContainerPropertyGenericClass这个方法,这个方法是让我们的NSArray或者NSSet这些容器知道里面的存储的元素是什么对象:

  • 这里注意下让这个类继承YYModel这个协议,否则会找不到这个方法
@interface Model : NSObject
@property (nonatomic, strong) NSString* fxDate;
@property (nonatomic, strong) NSString* sunrise;
@property (nonatomic, strong) NSString* sunset;
@property (nonatomic, strong) NSString* moonrise;
@property (nonatomic, strong) NSString* moonset;

@property (nonatomic, strong) NSString* moonPhase;
//@property (nonatomic, strong) NSString* moonPhaseIcon;
@property (nonatomic, strong) NSString* tempMax;
@property (nonatomic, strong) NSString* tempMin;
@property (nonatomic, strong) NSString* iconDay;
@property (nonatomic, strong) NSString* textDay;
@property (nonatomic, strong) NSString* iconNight;
@property (nonatomic, strong) NSString* textNight;
@property (nonatomic, strong) NSString* wind360Day;
@property (nonatomic, strong) NSString* windDirDay;
@property (nonatomic, strong) NSString* windScaleDay;
@property (nonatomic, strong) NSString* windSpeedDay;
@property (nonatomic, strong) NSString* wind360Night;
@property (nonatomic, strong) NSString* windDirNight;
@property (nonatomic, strong) NSString* windScaleNight;
@property (nonatomic, strong) NSString* windSpeedNight;
@property (nonatomic, strong) NSString* humidity;
@property (nonatomic, strong) NSString* precip;
@property (nonatomic, strong) NSString* pressure;
@property (nonatomic, strong) NSString* vis;
@property (nonatomic, strong) NSString* cloud;
@property (nonatomic, strong) NSString* uvIndex;
@end
@interface tryModel : NSObject<YYModel>
@property (nonatomic, strong) NSString* code;
@property (nonatomic, copy) NSArray* daily;
@end
+ (NSDictionary *)modelContainerPropertyGenericClass {
    return @{@"daily":[Model class]};
}

这里我们可以看到这里的数组里面存储的也是一个Model,所以我们在这个方法里面给他一个字典让这个属性对应Model的这个class,所以我们就可以让他进行一个Model的解析了。下面给出网络请求和YYModel数据结合

@implementation Model
-(void)dataLoad {
    NSString* urlString = @"https://devapi.qweather.com/v7/weather/3d?location=101010100&key=2211750bdc834763ba3c5f57ce98c307";
    //NSURL* url = [NSURL URLWithString:urlString];
    [[AFHTTPSessionManager manager] GET:urlString parameters:nil headers:nil progress:^(NSProgress * _Nonnull downloadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        tryModel* model = [tryModel yy_modelWithJSON:responseObject];
        NSDictionary* dirty = [model yy_modelToJSONObject];
        NSLog(@"%@", dirty);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error");
    }];
}
@end
@implementation tryModel

+ (NSDictionary *)modelContainerPropertyGenericClass {
    return @{@"daily":[Model class]};
}
@end

打印结果:

    code = 200;
    daily =     (
                {
            cloud = 55;
            fxDate = "2024-10-09";
            humidity = 26;
            iconDay = 305;
            iconNight = 151;
            moonPhase = "\U86fe\U7709\U6708";
            moonrise = "12:41";
            moonset = "21:28";
            precip = "1.0";
            pressure = 1013;
            sunrise = "06:19";
            sunset = "17:46";
            tempMax = 21;
            tempMin = 11;
            textDay = "\U5c0f\U96e8";
            textNight = "\U591a\U4e91";
            uvIndex = 3;
            vis = 24;
            wind360Day = 270;
            wind360Night = 0;
            windDirDay = "\U897f\U98ce";
            windDirNight = "\U5317\U98ce";
            windScaleDay = "1-3";
            windScaleNight = "1-3";
            windSpeedDay = 3;
            windSpeedNight = 16;
        },
                {
            cloud = 25;
            fxDate = "2024-10-10";
            humidity = 40;
            iconDay = 100;
            iconNight = 150;
            moonPhase = "\U4e0a\U5f26\U6708";
            moonrise = "13:36";
            moonset = "22:32";
            precip = "0.0";
            pressure = 1011;
            sunrise = "06:20";
            sunset = "17:44";
            tempMax = 21;
            tempMin = 8;
            textDay = "\U6674";
            textNight = "\U6674";
            uvIndex = 4;
            vis = 25;
            wind360Day = 0;
            wind360Night = 225;
            windDirDay = "\U5317\U98ce";
            windDirNight = "\U897f\U5357\U98ce";
            windScaleDay = "1-3";
            windScaleNight = "1-3";
            windSpeedDay = 3;
            windSpeedNight = 3;
        },
                {
            cloud = 25;
            fxDate = "2024-10-11";
            humidity = 47;
            iconDay = 100;
            iconNight = 150;
            moonPhase = "\U76c8\U51f8\U6708";
            moonrise = "14:22";
            moonset = "23:44";
            precip = "0.0";
            pressure = 1015;
            sunrise = "06:21";
            sunset = "17:42";
            tempMax = 23;
            tempMin = 11;
            textDay = "\U6674";
            textNight = "\U6674";
            uvIndex = 4;
            vis = 25;
            wind360Day = 180;
            wind360Night = 45;
            windDirDay = "\U5357\U98ce";
            windDirNight = "\U4e1c\U5317\U98ce";
            windScaleDay = "1-3";
            windScaleNight = "1-3";
            windSpeedDay = 3;
            windSpeedNight = 3;
        }
    );
}
Type: Notice | Timestamp: 2024-10-09 10:38:01.586475+08:00 | Process: YYModel | Library: YYModel | TID: 0x12795b1

这里就可以打印出JSON数据

白名单和黑名单

+ (NSArray<NSString *> *)modelPropertyBlacklist {
    return @[@"updateTime"];
}//这个方法不会处理JSON数据中的这个数据
+ (NSArray<NSString *> *)modelPropertyWhitelist {
    return @[@"daily"];
}//这个方法会让提仅仅处理JSON中的这个数据

如果实现这两个方法可以让我们获得我们所需要的数据

Model的嵌套

什么也不用做,我们只需要让一个Model的一个属性设置成另一个Model就可以了

例如:

// JSON
{
    "author":{
        "name":"J.K.Rowling",
        "birthday":"1965-07-31T00:00:00+0000"
    },
    "name":"Harry Potter",
    "pages":256
}

// Model: 什么都不用做,转换会自动完成
@interface Author : NSObject
@property NSString *name;
@property NSDate *birthday;
@end
@implementation Author
@end
	
@interface Book : NSObject
@property NSString *name;
@property NSUInteger pages;
@property Author *author; //Book 包含 Author 属性
@end
@implementation Book
@end

小结

本篇文章简单介绍了如何将网络请求中得到的数据转化成我们OC中的对象,方便我们对于数据进行操作处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动手学深度学习】6.4 多输入多输出通道

彩色图像具有标准的RBG通道来代表红绿蓝&#xff0c;但是到目前位置我们仅展示了单个输入和单个通道的简化例子。这使得我们可以将输入&#xff0c;卷积核和输出看作二维张量而当我们添加通道时&#xff0c;输入和隐藏表示都变成了三维张量。例如每个RGB输入图像都具有 3 h …

工具篇-完整的 Git 项目管理工具教程(在命令框中使用 Git、在 IDEA 中使用 Git)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Git 概述 2.0 Git 的安装和配置 3.0 获取本地仓库 3.1 基础操作指令 3.2 分支 4.0 Git 远程仓库 4.1 创建远程仓库 4.2 配置 SSH 公钥 4.3 操作远程仓库 5.0 使用…

活动预告|博睿数据将受邀出席GOPS全球运维大会上海站!

第二十四届 GOPS 全球运维大会暨研运数智化技术峰会上海站将于2024年10月18日-19日在上海中庚聚龙酒店召开。大会将为期2天&#xff0c;侧重大模型、DevOps、SRE、AIOps、BizDevOps、云原生及安全等热门技术领域。特设了如大模型 运维/研发测试、银行/证券数字化转型、平台工程…

Qt-系统处理窗口移动和大小改变相关事件(60)

目录 描述 使用 补充&#xff1a;事件分发 / 事件过滤 描述 移动和改变窗口大小事件 使用 重写事件 移动窗口位置 改变窗口大小 补充&#xff1a;事件分发 / 事件过滤 这个属于事件背后的逻辑&#xff0c;可以让程序员有更多的操作&#xff0c;不过要小心使用&#xff0c…

凸函数 (Convex Function)

文章目录 1.凸函数定义2. 凸函数和非凸函数的图示3.闭凸函数 1.凸函数定义 凸函数是指在其图像上的任意两个点之间画一条线&#xff0c;这条线始终不会低于函数图像。其数学定义为对于任何两个点 x x x 和 y y y&#xff0c;以及 λ ∈ [ 0 , 1 ] \lambda \in [0,1] λ∈[0,…

51单片机的智能温控风扇【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器步进电机按键、蜂鸣器、LED等模块构成。适用于智能风扇调速等相似项目。 可实现功能: 1、LCD1602实时显示温度、自动/手动和风扇风力等级 2、温度传感器DS18B20采集温度信息 3、手动模式&#xff1a;可…

【软件测试】基本知识3

一、能够说出软件缺陷判定标准 说明&#xff1a;执行结果与用例的期望结果不一致&#xff08;含义&#xff09;&#xff0c;为缺陷。 缺陷的定义&#xff1a;软件在使用过程中存在的任何问题都叫软件的缺陷&#xff0c;简称bug 缺陷判定标准 软件未实现需求&#xff08;规格&…

[单master节点k8s部署]37.微服务(一)springCloud 微服务

微服务架构的一个重要特点是&#xff0c;它与开发中使用的具体编程语言或技术栈无关。每个微服务都可以使用最适合其功能需求的语言或技术来实现。例如&#xff0c;一个微服务可以用Java编写&#xff0c;另一个微服务可以用Python、Go、Node.js等编写。微服务架构允许这种灵活性…

OpenCV高级图形用户界面(5)获取指定滑动条(trackbar)的当前位置函数getTrackbarPos()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 返回滑动条的位置。 该函数返回指定滑动条的当前位置。 cv::getTrackbarPos() 函数用于获取指定滑动条&#xff08;trackbar&#xff09;的当前…

【C++差分数组】P1672何时运输的饲料

本文涉及知识点 C差分数组 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 P1672何时运输的饲料 原文比较啰嗦&#xff0c;我简述一下&#xff1a; 第x天运来F1(1<F1<1e6)千克的饲料&#xff0c;第D&#xff08;1<2e3)天还剩F2&…

数据结构-5.7.二叉树的层次遍历

一.演示&#xff1a; 1.初始化队列&#xff1a; 2.根结点入队&#xff1a; 3.判断队列是否为空&#xff0c;此时有根结点&#xff0c;说明不为空&#xff0c;则队头结点即根结点出队并访问&#xff0c;再先进它的左结点&#xff0c;最后进它的右结点&#xff1a; 4.之后对进来…

4.stm32 GPIO输入

按键简介 按键&#xff1a;常见的输入设备&#xff0c;按下导通&#xff0c;松手断开 按键抖动&#xff1a;由于按键内部使用的是机械式弹簧片来进行通断的&#xff0c;所以在按下和松手的瞬间会伴随有一连串的抖动 传感器模块简介 传感器模块&#xff1a;传感器元件&#…

如何使用ssm实现超市管理系统

TOC 10917ssm超市管理系统 系统概述 进过系统的分析后&#xff0c;就开始记性系统的设计&#xff0c;系统设计包含总体设计和详细设计。总体设计只是一个大体的设计&#xff0c;经过了总体设计&#xff0c;我们能够划分出系统的一些东西&#xff0c;例如文件、文档、数据等。…

专线监控的使用方法:运维团队的全面实战指南

在当今高度信息化的时代&#xff0c;专线网络已成为企业连接不同地域、保障业务连续性的重要基础设施。然而&#xff0c;随着网络架构的复杂化和业务需求的多样化&#xff0c;运维团队面临着前所未有的挑战。为了有效应对这些挑战&#xff0c;运维团队需要深入了解并熟练掌握专…

利用GPU的OpenCL和MLC-LLM框架运行小语言模型-地瓜RDK X5开发板-非量产算法仅供整活

RDK™ X5机器人开发套件&#xff0c;D-Robotics RDK X5搭载Sunrise 5智能计算芯片&#xff0c;可提供高达10 Tops的算力&#xff0c;是一款面向智能计算与机器人应用的全能开发套件&#xff0c;接口丰富&#xff0c;极致易用。 本文利用其32GFLOPS的一颗小GPU&#xff0c;支持…

60 mysql 存储引擎之静态格式 MyISAM

前言 我们这里来看一下 MyISAM 存储引擎, 我们常见的那些 user, db, table_priv, proc 等等是基于 MyISAM 这是我们经常会提及的 两种持久化的存储引擎之一, 一是 MyISAM存储引擎, 另外一个是 InnoDB存储引擎 我们这里来看一下 MyISAM 中固定长度的数据表的相关处理 mysql…

振动分析-35-滚动轴承全生命周期模式下的时域特征对比(实战)

文章目录 1 数据集概述1.1 轴承参数1.2 运行工况1.3 数据详情2 加载显示全量数据2.1 数据提取2.2 全寿命数据可视化3 每次测量的时域特征3.1 计算时域特征的函数3.2 水平和垂直对比35Hz12kN3.3 水平和垂直对比37.5Hz11kN3.4 水平和垂直对比40Hz10kN3.5 结果分析4 参考附录1 数据…

单链表速通后续!

目录 1>>闲话 2>>头删 3>>查找 4>>在指定位置之前插入 5>>删除指定结点 6>>指定位置之后插入 7>>删除指定位置之后的结点 特别思考&#xff1a; 8>>销毁单链表 Slist.h Slist.c test.c 9>>总结 1>>闲话…

C++一个很好的计时方法

C一个很好的计时方法 //记时LARGE_INTEGER t1;LARGE_INTEGER t2;LARGE_INTEGER f;QueryPerformanceFrequency(&f);QueryPerformanceCounter(&t1);Sleep(100);QueryPerformanceCounter(&t2);double time;time (double)(t2.QuadPart-t1.QuadPart)/(double)f.QuadPar…

机器学习篇-day06-集成学习-随机森林 Adaboost GBDT XGBoost

一. 集成学习思想 集成学习 原理 集成学习是机器学习中的一种思想&#xff0c;它通过多个模型的组合形成一个精度更高的模型&#xff0c;参与组合的模型称为弱学习器&#xff08;基学习器&#xff09;。训练时&#xff0c;使用训练集依次训练出这些弱学习器&#xff0c;对未知…