「iOS」——YYModel学习

iOS学习

  • 前言
  • 优势
  • 使用方法
    • 简单的Model与JSON互转
    • 多样化的数据类型交换
      • 容器类数据交换
    • model中包含其他model
    • 白名单与黑名单
  • 总结

前言

YYModel是YYKit的高效组件之一,在实际场景中的非常实用,在项目中使用MVC架构时,可以简化数据处理。在性能上相比JSONMode更加高效。在此对使用做简单学习。


优势

原作者给出如下YYModel的优势:

  • 高性能:转换效率接近手写代码。
  • 自动类型转换:对象类型能自动转换。
  • 类型安全:在转换过程中所有的类型都会被验证,以确保类型安全。
  • 非侵入性:不需要让模型类继承自基类。
  • 轻量级:整个库只包含5个文件。
  • 文档和测试覆盖:100%文档覆盖,99.6代码覆盖。

使用方法

简单的Model与JSON互转

这里需要注意:
当 JSON/Dictionary 中的对象类型与 Model 属性不一致时,YYModel 将会进行如下自动转换。自动转换不支持的值将会被忽略,以避免各种潜在的崩溃问题。

JSON/DictionaryModel
NSStringNSNumber,NSURL,SEL,Class
NSNumberNSString
NSString/NSNumber基础类型 (BOOL,int,float,NSUInteger,UInt64,…) NaN 和 Inf 会被忽略
NSStringNSDate 以下列格式解析: yyy-MM-dd yyyy-MM-dd HH:mm:ss yyyy-MM-dd’T’HH:mm:ss yyyy-MM-dd’T’HH:mm:ssZ EEE MMM dd HH:mm:ss Z yyyy
NSDateNSString 格式化为 ISO8601: “YYYY-MM-dd’T’HH:mm:ssZ”
NSValuestruct (CGRect,CGSize,…)
NSNullnil,0
“no”,“false”,…@(NO),0
“yes”,“true”,…@(YES),1

多样化的数据类型交换

YYModel支持自定义的属性名进行映射,即数据的key和属性名可以是不相同。那么怎么才知道你自定义的属性名对应的是数据的哪个key呢?那就需要对自定义属性的映射进行映射声明。

+ (NSDictionary *)modelCustomPropertyMapper {
   // 将personId映射到key为id的数据字段
    return @{@"personId":@"id"};
}

可以看到model和JSON获取的字典内容并不完全相同,这时候需要我们重写modelCustomPropertyMapper这个方法,使用一个字典将Model属性名对映射到 JSON 的 Key。这就是映射声明。

+ (NSDictionary *)modelCustomPropertyMapper {
   // 映射可以设定多个映射字段
   return @{@"realComments":@[@"long_comments",@"comments",@"short_comments"]};
}
// ViewController.m
Model *model = [Model modelWithDictionary:dic];
NSLog(@"realComments: %d",model.realComments);

请添加图片描述

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

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

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


容器类数据交换

需要注意:要遵从< YYModel>协议,才会快捷提醒以下方法:

+ (nullable NSDictionary<NSString *, id> *)modelContainerPropertyGenericClass;
+ (nullable NSDictionary<NSString *, id> *)modelCustomPropertyMapper;
+ (nullable NSArray<NSString *> *)modelPropertyWhitelist;
+ (nullable NSArray<NSString *> *)modelPropertyBlacklist;

如果Model是用一个容器类进行包装的话,我们就需要重写modelContainerPropertyGenericClass这个方法返回对应容器之中的Model类型

JSON:
{
  "date": "20241020",
  "stories": [
    {
      "image_hue": "0xaa7246",
      "title": "小事 ·「谢谢,这歌儿真好听,谢谢。」",
      "url": "https://daily.zhihu.com/story/9776246",
      "hint": "VOL.1594",
      "ga_prefix": "102007",
      "images": [
        "https://pica.zhimg.com/v2-36a74af2cbeb2950e23f4a21ae7c9afc.jpg?source=8673f162"
      ],
      "type": 0,
      "id": 9776246
    },
    {
      "image_hue": "0x3d342b",
      "title": "很多人都认为大学知识跟高中没有关系,那为什么还要上高中呢?为什么不能初中毕业直接上大学?",
      "url": "https://daily.zhihu.com/story/9776259",
      "hint": "荆公门下东坡首徒 · 10 分钟阅读",
      "ga_prefix": "102007",
      "images": [
        "https://picx.zhimg.com/v2-f1f397a7fa6a1062bee7edd106c49496.jpg?source=8673f162"
      ],
      "type": 0,
      "id": 9776259
    },
    {
      "image_hue": "0x3d342b",
      "title": "武松血溅鸳鸯楼时,张都监的手下为什么不来帮忙?",
      "url": "https://daily.zhihu.com/story/9776265",
      "hint": "娃娃鱼 · 6 分钟阅读",
      "ga_prefix": "102007",
      "images": [
        "https://picx.zhimg.com/v2-f1f397a7fa6a1062bee7edd106c49496.jpg?source=8673f162"
      ],
      "type": 0,
      "id": 9776265
    },
    {
      "image_hue": "0x3d342b",
      "title": "这世界上最毒的物质是什么?",
      "url": "https://daily.zhihu.com/story/9776272",
      "hint": "mekdull · 47 分钟阅读",
      "ga_prefix": "102007",
      "images": [
        "https://picx.zhimg.com/v2-f1f397a7fa6a1062bee7edd106c49496.jpg?source=8673f162"
      ],
      "type": 0,
      "id": 9776272
    }
  ],
  "top_stories": [
    {
      "image_hue": "0x42535e",
      "hint": "作者 / 赵学浩",
      "url": "https://daily.zhihu.com/story/9776126",
      "image": "https://picx.zhimg.com/v2-00604b295890258d35108f32921dfdf2.jpg?source=8673f162",
      "title": "《封神演义》为什么没有列入四大名著?",
      "ga_prefix": "101607",
      "type": 0,
      "id": 9776126
    },
    {
      "image_hue": "0xaa7246",
      "hint": "作者 / 田可乐",
      "url": "https://daily.zhihu.com/story/9776246",
      "image": "https://picx.zhimg.com/v2-520eb91c117bf9da4f62071961629b85.jpg?source=8673f162",
      "title": "小事 ·「谢谢,这歌儿真好听,谢谢。」",
      "ga_prefix": "102007",
      "type": 0,
      "id": 9776246
    },
    {
      "image_hue": "0x8e6238",
      "hint": "作者 / 赵泠",
      "url": "https://daily.zhihu.com/story/9776243",
      "image": "https://picx.zhimg.com/v2-e10faf6e06d42ddaae06fc8dc6e648b8.jpg?source=8673f162",
      "title": "人类以外的动物有没有把自己的食物驯化得好吃的行为?",
      "ga_prefix": "101907",
      "type": 0,
      "id": 9776243
    },
    {
      "image_hue": "0x1a1b37",
      "hint": "作者 / 朱锦平",
      "url": "https://daily.zhihu.com/story/9776238",
      "image": "https://pic1.zhimg.com/v2-5ea4434e6ba5a4e1810059ae1c6c052e.jpg?source=8673f162",
      "title": "黑洞周围的「事件视界」是什么?",
      "ga_prefix": "101807",
      "type": 0,
      "id": 9776238
    },
    {
      "image_hue": "0xb39e74",
      "hint": "作者 / 南行兮",
      "url": "https://daily.zhihu.com/story/9776232",
      "image": "https://picx.zhimg.com/v2-aaa227e7ccc5781303cc1d8e885b9768.jpg?source=8673f162",
      "title": "我为什么总觉得辛弃疾用典的词写的很一般,而不用典的写的很好?",
      "ga_prefix": "101707",
      "type": 0,
      "id": 9776232
    }
  ]
}


@class Stories, Top_stories;

@interface Model
@property NSString *date;
@property NSArray *stories; 
@property NSArray *top_stories; 
@end

@implementation Model
// 返回容器类中的所需要存放的数据类型 (以 Class 或 Class Name 的形式)。
+ (NSDictionary *)modelContainerPropertyGenericClass {
    return @{@"stories" : [stories class],
             @"top_stories" : top_stories.class,
}
@end

打印结果:

{
    date = 20241021;
    stories =     (
                {
            "ga_prefix" = 102107;
            hint = "\U8c46\U5b50 \U00b7 2 \U5206\U949f\U9605\U8bfb";
            id = 9775499;
            "image_hue" = 0x5d6341;
            images =             (
                "https://pic1.zhimg.com/v2-241803af186704cf830cb0a3ad9268d2.jpg?source=8673f162"
            );
            title = "\U5728\U4e2d\U56fd\U53e4\U4ee3\Uff0c\U7834\U4ea7\U7684\U7537\U4eba\U7684\U4f8d\U59be\U5982\U4f55\U81ea\U5904\Uff1f";
            type = 0;
            url = "https://daily.zhihu.com/story/9775499";
        },
                {
            "ga_prefix" = 102107;
            hint = "\U674e\U7965JasonLee \U00b7 3 \U5206\U949f\U9605\U8bfb";
            id = 9776310;
            "image_hue" = 0x261e1b;
            images =             (
                "https://picx.zhimg.com/v2-aa2257309051a31b36501c840bf8cfaa.jpg?source=8673f162"
            );
            title = "\U4e4b\U524d\U542c\U8bf4\U589e\U808c\U8981\U505a\U5230\U529b\U7aed\Uff0c\U4e3a\U4ec0\U4e48\U73b0\U5728\U53c8\U63d0\U5021\U300c\U4e0d\U529b\U7aed\U300d\U4e86\Uff1f";
            type = 0;
            url = "https://daily.zhihu.com/story/9776310";
        },
                {
            "ga_prefix" = 102107;
            hint = "\U859b\U52a8\U8c14\U7684\U55b5 \U00b7 3 \U5206\U949f\U9605\U8bfb";
            id = 9776311;
            "image_hue" = 0x191924;
            images =             (
                "https://pic1.zhimg.com/v2-3673082d8ee90b155a4ecd2b556954a4.jpg?source=8673f162"
            );
            title = "\U8bba\U6587\U5e38\U7528\U8bcd\U6c47 i.e.\Uff0ce.g.\Uff0cetc.\Uff0cviz.\Uff0cet al. \U7684\U524d\U4e16\U4eca\U751f";
            type = 0;
            url = "https://daily.zhihu.com/story/9776311";
        },
                {
            "ga_prefix" = 102106;
            hint = "VOL.3454";
            id = 9776346;
            "image_hue" = 0xb3b3b3;
            images =             (
                "https://pic1.zhimg.com/v2-b8a38efaf99a864356cef394c26becc0.jpg?source=8673f162"
            );
            title = "\U778e\U626f \U00b7 \U5982\U4f55\U6b63\U786e\U5730\U5410\U69fd";
            type = 0;
            url = "https://daily.zhihu.com/story/9776346";
        }
    );
    "top_stories" =     (
                {
            "ga_prefix" = 101607;
            hint = "\U4f5c\U8005 / \U8d75\U5b66\U6d69";
            id = 9776126;
            image = "https://picx.zhimg.com/v2-00604b295890258d35108f32921dfdf2.jpg?source=8673f162";
            "image_hue" = 0x42535e;
            title = "\U300a\U5c01\U795e\U6f14\U4e49\U300b\U4e3a\U4ec0\U4e48\U6ca1\U6709\U5217\U5165\U56db\U5927\U540d\U8457\Uff1f";
            type = 0;
            url = "https://daily.zhihu.com/story/9776126";
        },
                {
            "ga_prefix" = 102007;
            hint = "\U4f5c\U8005 / \U7530\U53ef\U4e50";
            id = 9776246;
            image = "https://picx.zhimg.com/v2-520eb91c117bf9da4f62071961629b85.jpg?source=8673f162";
            "image_hue" = 0xaa7246;
            title = "\U5c0f\U4e8b \U00b7\U300c\U8c22\U8c22\Uff0c\U8fd9\U6b4c\U513f\U771f\U597d\U542c\Uff0c\U8c22\U8c22\U3002\U300d";
            type = 0;
            url = "https://daily.zhihu.com/story/9776246";
        },
                {
            "ga_prefix" = 101907;
            hint = "\U4f5c\U8005 / \U8d75\U6ce0";
            id = 9776243;
            image = "https://picx.zhimg.com/v2-e10faf6e06d42ddaae06fc8dc6e648b8.jpg?source=8673f162";
            "image_hue" = 0x8e6238;
            title = "\U4eba\U7c7b\U4ee5\U5916\U7684\U52a8\U7269\U6709\U6ca1\U6709\U628a\U81ea\U5df1\U7684\U98df\U7269\U9a6f\U5316\U5f97\U597d\U5403\U7684\U884c\U4e3a\Uff1f";
            type = 0;
            url = "https://daily.zhihu.com/story/9776243";
        },
                {
            "ga_prefix" = 101807;
            hint = "\U4f5c\U8005 / \U6731\U9526\U5e73";
            id = 9776238;
            image = "https://pic1.zhimg.com/v2-5ea4434e6ba5a4e1810059ae1c6c052e.jpg?source=8673f162";
            "image_hue" = 0x1a1b37;
            title = "\U9ed1\U6d1e\U5468\U56f4\U7684\U300c\U4e8b\U4ef6\U89c6\U754c\U300d\U662f\U4ec0\U4e48\Uff1f";
            type = 0;
            url = "https://daily.zhihu.com/story/9776238";
        },
                {
            "ga_prefix" = 101707;
            hint = "\U4f5c\U8005 / \U5357\U884c\U516e";
            id = 9776232;
            image = "https://picx.zhimg.com/v2-aaa227e7ccc5781303cc1d8e885b9768.jpg?source=8673f162";
            "image_hue" = 0xb39e74;
            title = "\U6211\U4e3a\U4ec0\U4e48\U603b\U89c9\U5f97\U8f9b\U5f03\U75be\U7528\U5178\U7684\U8bcd\U5199\U7684\U5f88\U4e00\U822c\Uff0c\U800c\U4e0d\U7528\U5178\U7684\U5199\U7684\U5f88\U597d\Uff1f";
            type = 0;
            url = "https://daily.zhihu.com/story/9776232";
        }
    );
}

model中包含其他model

仅需让一个model属性包含另一个model即可。


// JSON
{
    "memory ":{
        "name":"lfc",
        "birthday":"2023-07-26"
    },
    "name":"yl",
    "age":17
}
 
// Model: 什么都不用做,转换会自动完成
@interface Memory : NSObject
@property NSString *name;
@property NSDate *birthday;
@end
@implementation Memory 
@end
 
@interface People : NSObject
@property NSString *name;
@property NSUInteger age;
@property Author *author; //People 包含 Memory  属性
@end
@implementation People
@end


白名单与黑名单

注意:黑白名单不同时使用

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

总结

对YYModel的简单学习,后续还会对源码进行学习。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenShift 4 - 云原生备份容灾 - Velero 和 OADP 基础篇

《OpenShift 4.x HOL教程汇总》 说明&#xff1a; 本文主要说明能够云原生备份容灾的开源项目 Velero 及其红帽扩展项目 OADP 的概念和架构篇。操作篇见《OpenShift 4 - 使用 OADP 对容器应用进行备份和恢复&#xff08;附视频&#xff09; 》 Velero 和 OADP 包含的功能和模…

028.爬虫浏览器-抓取shadowRoot下的内容

一、什么是Shadow DOM Shadow DOM是一种在web开发中用于封装HTML标记、样式和行为的技术&#xff0c;以避免组件间的样式和脚本冲突。它允许开发者将网页的一部分隐藏在一个独立的作用域内&#xff0c;从而实现更加模块化和可维护的代码结构 二、js操作Shadow DOM // 获取宿…

邮件营销文案设计:打造个性化内容的步骤?

邮件营销文案写作技巧与方法&#xff1f;外贸邮件营销怎么撰写&#xff1f; 一个成功的邮件营销文案设计不仅能吸引客户的注意力&#xff0c;还能有效提升转化率。MailBing将详细探讨如何通过一系列步骤&#xff0c;打造出既个性化又高效的邮件营销文案设计。 邮件营销文案设…

监控易监测对象及指标之:Microsoft Message Queue(MSMQ)监控

监控易是一款强大的监控工具&#xff0c;能够实时监控各类IT设施和应用程序的性能指标。对于Microsoft Message Queue&#xff08;简称MSMQ&#xff09;的监控&#xff0c;监控易提供了详尽的指标&#xff0c;以确保企业能够准确掌握消息队列的运行状况。 在MSMQ的监控中&#…

24、darkhole_2

难度 高&#xff08;个人感觉属于中&#xff09; 目标 root权限2个flag 基于VMware启动&#xff08;我这里启动只能选择我wifi的那个网卡才能获取到ip地址&#xff0c;nat的没获取到不知道为什么。&#xff09; kali 192.168.1.122 靶机 192.168.1.170 信息收集 端口扫描 只开…

【python】OpenCV—Fun Mirrors

文章目录 1、准备工作2、原理介绍3、代码实现4、效果展示5、参考 1、准备工作 pip install vacm2、原理介绍 在OpenCV中&#xff0c;VCAM 库是一个用于简化创建三维曲面、定义虚拟摄像机、设置参数以及进行投影任务的工具。它特别适用于实现如哈哈镜等图像变形效果。 一、VC…

用你的手机/电脑运行文生图方案

随着ChatGPT和Stable Diffusion的发布&#xff0c;最近一两年&#xff0c;生成式AI已经火爆全球&#xff0c;已然成为移动互联网后一个重要的“风口”。就图片/视频生成领域来说&#xff0c;Stable Diffusion模型发挥着极其重要的作用。由于Stable Diffusion模型参数量是10亿参…

读者写者问题与读写锁

读者写者问题 读者写者 vs 生产消费 重点是有什么区别 读者写者问题如何理解 重点理解读者和写者如何完成同步 下面是一段伪代码&#xff1a;公共部分 uint32_t reader_count 0; lock_t count_lock; lock_t writer_lock; Reader // 加锁 lock(count_lock); if(reader_c…

Java | Leetcode Java题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; class Solution {public int[] constructRectangle(int area) {int w (int) Math.sqrt(area);while (area % w ! 0) {--w;}return new int[]{area / w, w};} }

5G物联网主机引领企业数字化转型

在当今这个信息化高度发展的时代&#xff0c;企业的竞争力很大程度上取决于其能否快速适应市场变化并高效地进行内部管理。郑州龙兴物联科技有限公司凭借其先进的5G物联网技术&#xff0c;推出了为企业量身定制的5G物联网主机&#xff0c;该设备充分利用其多协议、多接口的特点…

ESP32-C3 入门笔记04:gpio_key 按键 (ESP-IDF + VSCode)

1.GPIO简介 ESP32-C3是QFN32封装&#xff0c;GPIO引脚一共有22个&#xff0c;从GPIO0到GPIO21。 理论上&#xff0c;所有的IO都可以复用为任何外设功能&#xff0c;但有些引脚用作连接芯片内部FLASH或者外部FLASH功能时&#xff0c;官方不建议用作其它用途。 通过开发板的原…

【Vue】Vue3.0 (十二)、watchEffect 和watch的区别及使用

上篇文章&#xff1a; 【Vue】Vue3.0 &#xff08;十二&#xff09;、watch对ref定义的基本类型、对象类型&#xff1b;reactive定义的对象类型的监视使用 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&…

数据仓库基础概念

数据仓库 概念 数据仓库&#xff08;Data Warehouse, DW&#xff09;是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合。它是为满足企业决策分析需求而设计的。 面向主题&#xff1a;数据仓库围绕特定的主题组织数据&#xff0c;例如“销售”或“人力资源”&am…

线上交友小程序源码系统 一元盲盒小程序在线开好友 带完整的安装代码包以及搭建部署教程

系统概述 线上交友小程序源码系统是基于先进的技术架构开发的一套完整的解决方案&#xff0c;旨在为用户提供一个便捷、有趣的线上交友平台。该系统通过一元盲盒的形式&#xff0c;让用户在未知中寻找惊喜&#xff0c;增加了交友的趣味性和神秘感。 该系统采用了先进的编程技…

UE5蓝图中忽略触发区域进行碰撞

Event Hit :只会在碰撞到实体的时候产生碰撞。如果是触发区域则会忽略。 Destroy Actor&#xff1a;销毁自身。

openrtp 音视频时间戳问题

解决音视频发送的rtp问题 openrtp增加了音频aac的发送&#xff0c;地址 OpenRTP Gitee开源地址 同时使用两个rtp &#xff0c;来发送音频和视频 使用以下音频rtp&#xff0c;是可以发送和接收的&#xff0c;音频端口在视频端口上2 v0 o- 0 0 IN IP4 127.0.0.1 sMy Stream cI…

sentinel dashboard分布式改造落地设计实现解释(二)-分布式discovery组件

discovery discovery负责维护app/机器资料库&#xff0c;transport健康检测&#xff0c; transport上下线处理。discovery关键是分布式存储&#xff0c;后续研究一下raft&#xff0c;其复制&#xff0c;状态机&#xff0c;快照技术&#xff0c;但个人觉得&#xff0c;discover…

【网络安全】护网蓝队之应急响应

蓝队技术栈 Linux入侵排查 系统排查 一、查看历史命令 在Linux系统中&#xff0c;检查历史命令记录是安全审计的重要步骤之一&#xff0c;它可以帮助您了解系统上用户&#xff08;包括潜在的黑客&#xff09;的活动。以下是对您描述的重新表述和补充&#xff1a; 检查历史命…

webpack自定义插件 ChangeScriptSrcPlugin

插件文件 class ChangeScriptSrcPlugin {apply(compiler) {const pluginName "ChangeScriptSrcPlugin";compiler.hooks.compilation.tap(pluginName, (compilation, callback) > {compilation.hooks.htmlWebpackPluginAlterAssetTags.tapAsync(pluginName,(html…

LabVIEW提高开发效率技巧----节省内存

在LabVIEW开发过程中&#xff0c;内存管理是保障程序稳定性和性能的关键。本文将详细介绍如何通过队列处理来节省内存&#xff0c;尤其是如何通过解耦释放不再需要的数据&#xff0c;防止内存泄漏。通过多个实际例子&#xff0c;从不同角度探讨队列处理在大数据量或长时间运行的…