当前位置: 首页 > news >正文

【iOS】YYModel

目录

什么是YYModel ?

如何使用YYModel ?

最简单的Model

与网络请求结合

属性为容器类的Model

白名单和黑名单

Model的嵌套

结语


什么是YYModel ?

YYModel是一个用于 iOS 和 macOS 开发的高性能的模型框架,主要用于对象和 JSON(JavaScript Object Notation)数据之间的转换。

主要特点和功能包括:

  1. 高性能转换:在对象和 JSON 之间进行转换时速度非常快,能高效地处理大量数据。
  2. 自动映射:可以自动将 JSON 数据中的键值对映射到模型对象的属性上,无需手动编写大量的映射代码。例如,当 JSON 中的一个键与模型对象的属性名相同时,YYModel可以自动将该键对应的值赋值给这个属性。
  3. 支持复杂数据结构:能够处理包含嵌套对象、数组等复杂数据结构的 JSON 数据,并且可以将这些复杂结构映射到相应的模型对象结构中。
  4. 类型安全:确保在转换过程中数据类型的正确性,减少因类型不匹配而导致的错误。
  5. 可扩展性:可以方便地进行扩展和定制,以满足特定的业务需求。

使用YYModel可以极大地简化 iOS 和 macOS 应用程序中数据模型的处理,提高开发效率和代码的可维护性。

如何使用YYModel ?

YYModel的主体工作就是JSON转模型。

最简单的Model

定义一个模型类,该类的属性要与 JSON 数据中的键相对应。

例如这段YYModel原作者github使用文档里的示例:

// 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// 将 JSON (NSData,NSString,NSDictionary) 转换为 Model:
User *user = [User yy_modelWithJSON:json];// 将 Model 转换为 JSON 对象:
NSDictionary *json = [user yy_modelToJSONObject];

这段代码中JSON数据的字典键与Model中属性名一一对应,最下面几行代码则是调用方法实现Json数据到Model的转换和Model到JSON的转换

与网络请求结合

void dataload {NSString* urlString = @"https://devapi.qweather.com/v7/weather/3d?location=101010100&key=34e1f7a3ef5544d393fcafaea08f0f1b";NSURL* url = [NSURL URLWithString:urlString];NSURLRequest *request = [NSURLRequest requestWithURL:url];NSURLSession *session = [NSURLSession sharedSession];NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (!error && data) {NSError *jsonError;NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];if (!jsonError && [jsonDict isKindOfClass:[NSDictionary class]]) {AModel *model = [AModel yy_modelWithDictionary:jsonDict];NSLog(@"%@",model);}} else {NSLog(@"Error: %@", error);}}];[task resume];
}

属性为容器类的Model

有时JSON数据中的键对应的是一个容器类,这时我们就需要调用YYModel协议中的方法来告诉这个类它里面放的元素应该是什么类型的

这个方法就是+ (NSDictionary *)modelContainerPropertyGenericClass

在方法中,我们直接返回元素的类型。

{"code": "200","updateTime": "2024-10-20T16:18+08:00","fxLink": "https://www.qweather.com/weather/beijing-101010100.html","daily": [{"fxDate": "2024-10-20","sunrise": "06:31","sunset": "17:29","moonrise": "19:01","moonset": "09:48","moonPhase": "亏凸月","moonPhaseIcon": "805","tempMax": "12","tempMin": "1","iconDay": "305","textDay": "小雨","iconNight": "151","textNight": "多云","wind360Day": "180","windDirDay": "南风","windScaleDay": "1-3","windSpeedDay": "3","wind360Night": "180","windDirNight": "南风","windScaleNight": "1-3","windSpeedNight": "3","humidity": "58","precip": "1.0","pressure": "1016","vis": "25","cloud": "55","uvIndex": "2"},{"fxDate": "2024-10-21","sunrise": "06:32","sunset": "17:28","moonrise": "19:51","moonset": "11:02","moonPhase": "亏凸月","moonPhaseIcon": "805","tempMax": "14","tempMin": "6","iconDay": "101","textDay": "多云","iconNight": "305","textNight": "小雨","wind360Day": "225","windDirDay": "西南风","windScaleDay": "1-3","windSpeedDay": "3","wind360Night": "0","windDirNight": "北风","windScaleNight": "1-3","windSpeedNight": "16","humidity": "48","precip": "0.0","pressure": "1017","vis": "25","cloud": "25","uvIndex": "4"},{"fxDate": "2024-10-22","sunrise": "06:33","sunset": "17:26","moonrise": "20:49","moonset": "12:07","moonPhase": "亏凸月","moonPhaseIcon": "805","tempMax": "16","tempMin": "4","iconDay": "101","textDay": "多云","iconNight": "150","textNight": "晴","wind360Day": "0","windDirDay": "北风","windScaleDay": "1-3","windSpeedDay": "16","wind360Night": "270","windDirNight": "西风","windScaleNight": "1-3","windSpeedNight": "3","humidity": "44","precip": "0.0","pressure": "1014","vis": "24","cloud": "25","uvIndex": "2"}],"refer": {"sources": ["QWeather"],"license": ["CC BY-SA 4.0"]}
}

比如这段JSON数据,daily对应的属性是一个数组,而这个数组中包含三个字典,这三个字典其实可以转化成同一种model,因此我们就需要调用方法来告诉model,daily数组中所存放的元素是一个model。

注意,在声明 + (NSDictionary *)modelContainerPropertyGenericClass这个方法时,要让该类遵守YYModel协议。

然后我们在方法中返回元素的类型

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

在model中 实现这个方法,我们使用一个字典,将daily对应的键值设置为我们要设置的dailyModel属性,这里的dailyModel也就是数组中所存放元素的类型。

白名单和黑名单

关于黑名单和白名单,其实就是通过两个方法来屏蔽和选中一些属性,让model不要处理或者只处理某些属性。

  • 白名单是一个指定的属性列表,只有在这个列表中的属性会被YYModel在映射过程中处理。这意味着当从 JSON 数据转换为模型对象或者从模型对象转换为 JSON 数据时,只有白名单中的属性会被考虑。
  • 黑名单与白名单相反,是一个指定的属性列表,这些属性在映射过程中会被YYModel忽略。
+ (NSArray<NSString *> *)modelPropertyWhitelist {return @[@"name", @"age"];}
+ (NSArray<NSString *> *)modelPropertyBlacklist {return @[@"secretInfo"];}

Model的嵌套

关于model的嵌套,其实就是将model的属性设为另一个model,model其实是NSObject的子类,所以不需要多加处理,直接设为属性即可

结语

关于YYModel,其实还有一些Model和字典之间的转换,以及匹配不到字典对应键时的处理,这些东西之后会再完善。

相关文章:

【iOS】YYModel

目录 什么是YYModel &#xff1f; 如何使用YYModel &#xff1f; 最简单的Model 与网络请求结合 属性为容器类的Model 白名单和黑名单 Model的嵌套 结语 什么是YYModel &#xff1f; YYModel是一个用于 iOS 和 macOS 开发的高性能的模型框架&#xff0c;主要用于对象和…...

Cadence元件A属性和B属性相互覆盖

最近在使用第三方插件集成到Cadence,协助导出BOM到平台上&#xff0c;方便对BOM进行管理和修改&#xff0c;结果因为属性A和属性B不相同&#xff0c;导致导出的BOM错误。如下图&#xff1a; ​​ 本来我们需要导出Q12&#xff0c;结果给我们导出了Q13&#xff0c;或者反之&…...

【火山引擎】语音合成 | HTTP接口 | 一次性合成 | python

目录 一 准备工作 二 HTTP接口(一次性合成-非流式) 1 接口说明 2 身份认证 3 请求方式 三 实践 四 注意事项 火山引擎语音合成TTS(Text-to-Speech)是一种基于云计算的语音合成服务,可以将文本转化为自然、流畅的语音。以下是火山引擎TTS的主要功能和特点: ①多种语音…...

YOLOv11改进-卷积-空间和通道重构卷积SCConv

本篇文章将介绍一个新的改进模块——SCConv&#xff08;小波空间和通道重构卷积&#xff09;&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。为了减少YOLOv11模型的空间和通道维度上的冗余&#xff0c;我们引入空间和通道重构卷积。首先&#xff0c;…...

记录一次从nacos配置信息泄露到redis写计划任务接管主机

经典c段打点开局。使用dddd做快速的打点发现某系统存在nacos权限绕过 有点怀疑是蜜罐&#xff0c;毕竟nacos这实在是有点经典 nacos利用 老规矩见面先上nacos利用工具打一波看看什么情况 弱口令nacos以及未授权访问&#xff0c;看这记录估计被光顾挺多次了啊 手动利用Nacos-…...

Unity加载界面制作

效果 UI部分 结构 说下思路: 因为是加载界面,所以最上层是一个Panel阻止所有的UI交互,这个Panel如果有图片就加一个图片,如果没有可以把透明度调到最大,颜色设为黑色. 下面最核心的就是一个进度条了,有图片的话,将进度条的底放进来,将进度条锚点设为下中,将滑动块的尺寸设为0.…...

最好的ppt模板网站是哪个?做PPT不可错过的18个网站!

现在有很多PPT模板网站&#xff0c;但真正免费且高质量的不多&#xff0c;今天我就分享主流的国内外PPT模板下载网站&#xff0c;并且会详细分析这些网站的优缺点&#xff0c;这些网站都是基于个人实际使用经验的&#xff0c;免费站点会特别标注&#xff0c;让你可以放心下载&a…...

煤矿安全监测监控作业题库

第一部分 安全法律法规知识子题库 单选题 1.《安全生产法》规定&#xff0c;生产经营单位应当向从业人员如实告知作业场所和工作岗位存在的(A)、防范措施以及事故应急措施。 A. 危险因素    B. 人员状况    C. 设备状况    D. 环境状况 2.《安全生产法》规定&…...

【记录】Django数据库的基础操作

数据库连接 在Django中使用 mysqlclient 这个包用于数据库的连接&#xff0c;切换至 Django环境中直接 pip install mysqlclient 安装此包 1 数据库连接配置 在项目目录下的setting.py中配置 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: mini,#数据库名US…...

XHCI 1.2b 规范摘要(五)

系列文章目录 XHCI 1.2b 规范摘要&#xff08;一&#xff09; XHCI 1.2b 规范摘要&#xff08;二&#xff09; XHCI 1.2b 规范摘要&#xff08;三&#xff09; XHCI 1.2b 规范摘要&#xff08;四&#xff09; XHCI 1.2b 规范摘要&#xff08;五&#xff09; 文章目录 系列文章目…...

小程序短链接生成教程

文章目录 一、小程序短链接&#xff08;必须发布正式的小程序才能生成短链接&#xff01;&#xff01;&#xff01;&#xff09;二、使用步骤1.获取token信息2.获取短链接 总结 一、小程序短链接&#xff08;必须发布正式的小程序才能生成短链接&#xff01;&#xff01;&#…...

C++进阶之路:再谈构造函数、static成员、友元(类与对象_下篇)

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

C 函数指针与回调函数

C 函数指针与回调函数 在C语言中&#xff0c;函数指针和回调函数是两个非常强大的概念&#xff0c;它们在提高代码的灵活性和模块化方面发挥着重要作用。本文将详细介绍C语言中的函数指针和回调函数&#xff0c;包括它们的定义、用法和实际应用场景。 函数指针 定义 函数指…...

CTF(九)

导言&#xff1a; 本文主要讲述在CTF竞赛网鼎杯中&#xff0c;web类题目AreUSerialz。 靶场链接&#xff1a;BUUCTF在线评测 一&#xff0c;分析代码。 看到了一大段php代码。 <?php// 引入flag.php文件 include("flag.php");// 高亮显示当前文件 highlight…...

三种单例实现

1、不继承Mono的单例 实现 使用 注&#xff1a; 使用需要继承BaseManager 泛型填写自己本身 需要实现无参构造函数 2、挂载式的Mono单例 实现 使用 注&#xff1a; 使用需要继承SingletonMono 泛型填写自己本身 需要挂载在unity引擎面板 3、不用挂载式的单例 实现 使…...

Spring XML配置方式和Spring Boot注解方式的详细对照关系

功能/配置项Spring XML配置方式Spring Boot注解方式定义Beanxml <bean id"myBean" class"com.example.MyBean"/>javaBeanpublic MyBean myBean() { return new MyBean(); }注入Beanxml <bean id"myBean" class"com.example.MyBea…...

leetcode 无重复字符串的排列和组合

1.题目要求: 2.题目代码&#xff1a; class Solution { public:vector<string> result;string str;//利用回溯去解决此问题void backtricking(string S,vector<bool>& used){if(str.size() S.size()){result.push_back(str);}//用used去掉重复的排列与组合f…...

7. 配置

三种获取配置的方法 返回 /config/config.php 、/config/autoload/xxx.php 中的值 <?php namespace App\Controller;use Hyperf\Config\Annotation\Value; use Hyperf\Contract\ConfigInterface; use Hyperf\Di\Annotation\Inject; use Hyperf\HttpServer\Annotation\AutoC…...

WPF中Grid、StackPanel、Canvas、WrapPanel的区别

WPF 中的 Grid、StackPanel、Canvas 和 WrapPanel 都是布局控件&#xff0c;用于在用户界面中组织和排列元素&#xff0c;但它们各自有不同的布局行为和用途。以下是它们的主要区别&#xff1a; Grid&#xff1a; Grid 是最灵活的布局控件&#xff0c;类似于 HTML 中的表格&…...

昇思MindSpore进阶教程--开发常见问题

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 MindSpore官网提供了一份在使用MindSpore…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...