[iOS] YYModel 初步学习 - 教程

news/2025/10/9 13:59:58/文章来源:https://www.cnblogs.com/lxjshuju/p/19130996

[iOS] YYModel 初步学习

前言

iOS 开发中少不了各种各样的模型,不论是采用 MVC、MVP 还是 MVVM 设计模式都逃不过 Model。那么大家在使用 Model 的时候肯定遇到过一个问题,即接口传递过来的数据(一般是 JSON 格式)需要转换为 iOS 内我们能直接使用的模型(类)。iOS 开发早期第三方框架没有那么多,大家可能会手写相关代码,但是随着业务的扩展,模型的增多,这些没什么技术含量的代码只是在重复的浪费我们的劳动力而已。所以就会出现 YYModel 这一类的第三方库来解放我们的劳动力。

YYModel 与其他第三方库的对比

img

这里可以看出 YYmodel 的性能是超过了 JSONNModel 的,下文只会介绍到 YYModel 的使用。

YYModel 的使用场景

简单的 Model 与 JSON

// 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];

上面是最简单的 Model 的形式

当 JSON/Dictionary 中的对象类型与 Model 属性不一致时,YYModel 将会进行如下自动转换。自动转换不支持的值会被忽视。

img

Model 属性名和 JSON 中的 Key 不相同

// JSON:
{
"n":"Harry Pottery",
"p": 256,
"ext" : {
"desc" : "A book written by J.K.Rowing."
},
"ID" : 100010
}
// Model:
@interface Book : NSObject
@property NSString *name;
@property NSInteger page;
@property NSString *desc;
@property NSString *bookID;
@end
@implementation Book
//返回一个 Dict,将 Model 属性名对映射到 JSON 的 Key。
+ (NSDictionary *)modelCustomPropertyMapper {
return @{
@"name" : @"n",
@"page" : @"p",
@"desc" : @"ext.desc",
@"bookID" : @[@"id",@"ID",@"book_id"]
};
}
@end

你可以把一个或一组 JSON Key (Key path)映射到一个或多个属性。如果一个属性没有映射关系,那默认会使用相同属性名作为映射。

在 JSON->Model 的过程中:如果一个属性对应了多个 JSON Key,那么转换过程会按顺序查找,并使用第一个不为空的值。

在 Model->JSON 的过程中:如果一个属性对应了多个 JSON Key(Key path),那么转换过程仅会处理第一个 JSON Key(Key path);如果多个属性对应了同一个 JSON Key,则转换过程会使用其中任意一个不为空的值。

Model 包含其他 Model

@interface Condition : NSObject
@property (nonatomic, assign) NSInteger code;
@property (nonatomic, copy) NSString *icon;
@property (nonatomic, copy) NSString *text;
@end
@interface CurrentWeather : NSObject
@property (nonatomic, assign) NSInteger cloud;
@property (nonatomic, strong) Condition *condition;
@property (nonatomic, assign) CGFloat temp_c;
@property (nonatomic, assign) CGFloat humidity;
@property (nonatomic, copy) NSString *last_updated;
@end

容器类属性

@interface ForecastDay : NSObject
@property (nonatomic, copy) NSString *date;
@property (nonatomic, strong) Astro *astro;
@property (nonatomic, strong) Day *day;
@property (nonatomic, strong) NSArray<HourWeather *>*hour;@end@implementation ForecastDay+ (NSDictionary *)modelContainerPropertyGenericClass {return @{@"hour" : [HourWeather class]};}@end

这里我们需要调用一下+ (NSDictionary *)modelContainerPropertyGenericClass这个方法,这个方法是让我们的NSArray或者NSSet这些容器知道里面的存储的元素是什么对象。

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

#import "ViewController.h"
#import <AFNetworking/AFNetworking.h>#import "Model.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];NSDictionary *cityDict = @{@"name": @"西安"};[self searchWearth:cityDict];}- (void) searchWearth: (NSDictionary *) city {NSString *cityName = city[@"name"];if (cityName.length == 0) {return;}NSString *apiKey = @"8950a91429864a60a7b105904252508";NSString *encodeQuery = [cityName stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];NSString *urlStr = [NSString stringWithFormat:@"https://api.weatherapi.com/v1/forecast.json?key=%@&q=%@&lang=zh&days=7", apiKey, encodeQuery];AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];manager.requestSerializer = [AFJSONRequestSerializer serializer];[manager GET:urlStr parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {if (![responseObject isKindOfClass:[NSDictionary class]]) {return;}NSDictionary *JSONDict = responseObject;WeatherResponse *response = [WeatherResponse yy_modelWithDictionary:JSONDict];// NSLog(@"当前最高温度: %.1f, 天气: %@", response.current.temp_c, response.current.condition.text);// NSLog(@"back JSON Task %@", responseObject);NSLog(@"%@", JSONDict);NSLog(@"%@", response.forecast.forecastday);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"请求失败%@", error);}];}@end

下面是打印结果

(
"",
"",
""
)

这里显示地址的原因是

  • 打印数组时,NSArray 内部默认调用每个对象的 -description 方法。
  • 如果模型类(ForecastDay)里没有重写 -description 方法,就只会显示 类名 + 内存地址(也就是你现在看到的效果)。

黑名单与白名单

@interface User
@property NSString *name;
@property NSUInteger age;
@end
@implementation Attributes
// 如果实现了该方法,则处理过程中会忽略该列表内的所有属性
+ (NSArray *)modelPropertyBlacklist {
return @[@"test1", @"test2"];
}
// 如果实现了该方法,则处理过程中不会处理该列表外的属性。
+ (NSArray *)modelPropertyWhitelist {
return @[@"name"];
}
@end
  1. 避免无用属性被解析

    有时模型里会有一些临时字段(比如缓存数据、运行时状态),它们并不来自 JSON,也不应该写回 JSON。

    可以把这些属性加到 黑名单,YYModel 就不会去管它们。

  2. 提高安全性

    如果后台返回了额外字段,而你的模型刚好有同名属性,可能会被覆盖。

    白名单限制只解析你关心的属性,就不会意外污染数据。

上面是黑白名单的作用

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

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

相关文章

吴恩达深度学习课程一:神经网络和深度学习 第二周:神经网络基础(三)

此分类用于记录吴恩达深度学习课程的学习笔记。 课程相关信息链接如下:原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai github课程资料,含课件与笔记:吴恩达深度学习教学资料 课程配套练习(中英)与答案…

qwen3:0.6b模型的基本参数存在的价值应用场景分析

Qwen3:0.6B 是通义千问(Qwen)系列中的一个轻量级语言模型,其名称中的 “0.6B” 表示该模型大约拥有 6亿参数(即 0.6 billion parameters)。作为 Qwen3 系列中参数规模较小的成员,它在性能、资源消耗和部署灵活性…

Gitee Insight领航研发效能工具市场:国产化与智能化双轮驱动下的技术突围

Gitee Insight领航研发效能工具市场:国产化与智能化双轮驱动下的技术突围 在数字化浪潮席卷全球的当下,软件研发效能已成为企业核心竞争力的关键指标。IDC最新报告显示,2024年中国DevOps市场规模已达120亿元,年复合…

【大数据】AI就业影响数据可视化分析系统 计算机毕业设计项目 Anaconda+Django+Spark+Hadoop环境调整 附源码+文档+讲解

【大数据】AI就业影响数据可视化分析系统 计算机毕业设计项目 Anaconda+Django+Spark+Hadoop环境调整 附源码+文档+讲解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importa…

电商网站建设书在线做初中题网站

一、Tab补全 在shell中输入表达式&#xff0c;按下Tab&#xff0c;会搜索已输入变量&#xff08;对象、函数等等&#xff09;的命名空间&#xff1a; 除了补全命名、对象和模块属性&#xff0c;Tab还可以补全其它的。当输入看似文件路径时 &#xff08;即使是Python字符串&…

做效果图的网站有哪些软件有哪些不花钱做推广的网站

原标题&#xff1a;IT兄弟连 HTML5教程 HTML5表单 多样的输入类型1HTML5拥有多个新的表单输入类型&#xff0c;这些新特性提供了更好的输入控制和验证。并不是所有的主浏览器都支持新的input类型&#xff0c;不过我们可以在所有的主浏览器中使用它们&#xff0c;即使不被支持&a…

2026 航空航天、智能感知与控制国际学术会议

【2026 航空航天、智能感知与控制国际学术会议】 2026 International Conference on Aerospace, Intelligent Perception and Control 🔍会议官网:http://www.icaipc.org/ 🏆 主办:南京信息工程大学 🎤嘉宾报告…

Trae 或 vscode无法在vue文件中自动跳转解决

1.安装插件: 2.软件右下角找到语言模式,选择".vue"的配置文件关联 3.若vue文件中的import 仍然无法跳转,则需要在根目录新建一个文件 jsconfig.json{"compilerOptions": {"baseUrl"…

实用指南:小白也能学会的大模型构建:DeepSeek实战教程+代码解析

实用指南:小白也能学会的大模型构建:DeepSeek实战教程+代码解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

酒店网站开发回扣在网站中动态效果怎么做

为文档添加注释 <!--这里是注释--> 或者 <!--这里也是注释 并且可以分为多行-->

​​无源探头与高压差分探头的技术比较与应用选择​​

本文对比了无源探头和高压差分探头在设计原理、性能参数、应用场景等方面的特点,为选择合适探头提供参考。在电子测量领域,电压测量是电路调试、性能评估和故障诊断的基础工作。无源探头和高压差分探头作为两种常用的…

PKDV5351高压差分探头在氢燃料电池堆电压均衡监测中的实战应用案例

一、项目背景与核心挑战 在新一代氢燃料电池汽车的研发过程中,某新能源企业遭遇了氢燃料电池堆电压监测的关键难题。该氢燃料电池堆由200节单体电池串联而成,工作电压峰值高达3500V。为了精准把控电压均衡状态,需要…

公司网站空间电子商务网站建设选修课

一、问题 在微服务项目中&#xff0c;明明已经设置允许跨域访问&#xff1a; 为什么还会出现跨域请求问题&#xff1f; 二、为什么 仔细查看错误提示信息&#xff1a;When allowCredentials is true, allowedOrigins cannot contain the special value "*" since t…

2025秋_8

今天填写了统一建模语言题目申请表,并学习了Java

react的依赖项数组 - 实践

react的依赖项数组 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

25年人教版一年级资料汇总!(一年级数学上册典型练习题)(解决问题共150道)电子版可打印(共6页)!可打印可下载

25年人教新版一年级上册数学(一年级数学上册典型练习题)(解决问题共150道),电子版可打印可下载,可帮助孩子查漏补缺,提升数学计算水平。免费资料点击以下可获取小学学科上下册资料汇总 添加图片注释,不超过 140 字…

seo全站优化全案例网站建设设计主要系统

立即学习:https://edu.csdn.net/course/play/19711/343119?utm_sourceblogtoedu 1.菜单menu: 1&#xff09;弹出式菜单&#xff0c;类似与电脑桌面右击弹出的菜单成为弹出菜单&#xff1b; 2&#xff09;窗体式菜单&#xff1a;类似于word上面的菜单栏 2.窗体菜单创建的步骤…

专业做包装设计网站快乐麻花网站源码

现在的计算机的图像的都是用像素表示的&#xff0c;无论是点、直线、圆或其他图形最终都会以点的形式显示。人们看到屏幕的直线只不过是模拟出来的&#xff0c;人眼不能分辨出来而已。那么计算机是如何画直线的呢&#xff0c;其实有比较多的算法&#xff0c;这里讲的是Bresenha…

有做翻译英文网站网络推广搜索引擎

案例1&#xff1a;开机保护检查整流桥、场管、快恢复二极管都正常。通电试机&#xff0c;面板亮黄灯&#xff0c;拔掉中板变压器接插线&#xff0c;黄灯灭&#xff0c;怀疑中板变压器有损坏。断电&#xff0c;用电感表测量变压器电感量&#xff0c;中板采用三个变压器并联&…

VSCode万能Debug任何执行python文档命令的详细教程

VSCode万能Debug任何执行python文档命令的详细教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…