【iOS】YYModel

news/2024/10/24 4:04:28/

目录

什么是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和字典之间的转换,以及匹配不到字典对应键时的处理,这些东西之后会再完善。


http://www.ppmy.cn/news/1541509.html

相关文章

Redis的Bin目录文件及常用命令

Redis的Bin目录文件 全局命令Redis键/KeyRedis字符串&#xff08;String&#xff09;Redis 哈希(Hash)Redis 列表(List)Redis 集合(Set)Redis 有序集合(sorted set)Redis的位图&#xff08;Bitmap&#xff09;Redis HyperLogLogRedis GEOGeoHash编码方式Base32编码标准Base32编…

什么是凸二次规划问题

我们从凸二次规划的基本概念出发&#xff0c;然后解释它与支持向量机的关系。 一、凸二次规划问题的详细介绍 凸二次规划问题是优化问题的一类&#xff0c;目标是最小化一个凸的二次函数&#xff0c;受一组线性约束的限制。凸二次规划是一类特殊的二次规划问题&#xff0c;其…

【存储设备专栏 2.2 -- linux 下 fdisk -l 命令详细介绍2 】

文章目录 实例详解 fdisk -l第一部分&#xff1a;磁盘 /dev/sda详细解释&#xff1a; 第二部分&#xff1a;环回设备 /dev/loop8详细解释&#xff1a; 总结 实例详解 fdisk -l 在 Linux 系统中执行 fdisk -l 命令会输出详细的磁盘和分区信息。下面我们具体解释一下下面的log每…

嵌套div导致子区域margin失效问题解决

嵌套div导致子区域margin失效问题解决 现象原因解决方法 现象 <div class"prev"></div> <div class"parent"><div class"child"></div><div class"child"></div> </div> <div cl…

数字孪生城市:智慧城市的未来蓝图

在当今数字化时代&#xff0c;智能技术的广泛应用正在改变人们的生活和工作方式。数字孪生城市作为未来新型智慧城市演进的重要方向&#xff0c;数字孪生城市是一种将城市物理世界的各个方面转化为数字形式的技术&#xff0c;通过网络空间与物理世界之间的实时数据交换和仿真分…

重构手法整理

提示&#xff1a;文章 文章目录 文章目录 文章目录 前言一、背景二、重构手法2.1 以委托取代继承2.2 使用c实现 三、3.1 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 最近 二、重构手法 2.1 以委托取代继承 以委托取代继承是指我们常常为了一时的便利而…

【VUE】v-show 和 v-if 的区别

v-show 始终会保留对应的 HTML 元素&#xff0c;只是在隐藏时通过 CSS 样式控制元素不可见&#xff1b;而 v-if 会根据表达式的值条件地渲染或销毁对应的 HTML 元素。v-show 是基于 CSS 的切换&#xff0c;切换速度相对较快&#xff0c;但对页面的渲染效率影响较大&#xff1b;…

MySQL中的最左前缀匹配原则

最左前缀匹配原则是 MySQL 在使用索引时遵循的一种规则&#xff0c;尤其在涉及到组合索引&#xff08;联合索引&#xff09;时。 最左前缀匹配原则指的是在使用组合索引时&#xff0c;MySQL 会从最左边的索引列开始匹配&#xff0c;直到遇到第一个无法继续匹配的列为止。这意味…