【iOS】——用单例类封装网络请求
文章目录
- 一、JSONModel
- 1.JSONModel的简单介绍
- 2.JSONModel的使用
- 二、单例类和Block传值
一、JSONModel
1.JSONModel的简单介绍
JSONModel一个第三方库,这个库用来将网络请求到的JSON格式的数据转化成Foundation框架下的Model类的属性,这样我们就可以直接通过访问Model类的属性来访问网络请求到的数据。
2.JSONModel的使用
要使用JSONModel库首先需要通过CocoaPods下载第三方库到目标文件中。接着在文件中创建一个Model类并且继承于JSONModel类。根据网络请求的JSON格式数据确定创建的类和属性。
例如JSON数据格式如下:


那么就需要在Model类中声明接收数据的协议并实现继承于JSONModel的类,这里我声明了storiesModel和top_StoriesModel两个协议并实现继承于JSONModel类的storiesModel和top_StoriesModel类来实现接收网络请求的数据。
GetModel.h
@protocol storiesModel@end@protocol top_StoriesModel@end
#import <JSONModel/JSONModel.h>
#import "JSONModel.h"
NS_ASSUME_NONNULL_BEGIN@interface storiesModel : JSONModel
@property (nonatomic, copy) NSString* image_hue;
@property (nonatomic, copy) NSString* title;
@property (nonatomic, copy) NSString* url;
@property (nonatomic, copy) NSString* hint;
@property (nonatomic, copy) NSString* ga_prefix;
@property (nonatomic, copy) NSArray* images;@end@interface top_StoriesModel : JSONModel
@property (nonatomic, copy) NSString* image_hue;
@property (nonatomic, copy) NSString* title;
@property (nonatomic, copy) NSString* url;
@property (nonatomic, copy) NSString* hint;
@property (nonatomic, copy) NSString* ga_prefix;
@property (nonatomic, copy) NSString* image;
@property (nonatomic, copy) NSString* type;
@end//设置一个字符串和两个自定义类的数组来接收网络请求的数据@interface GetModel : JSONModel
@property (nonatomic, copy) NSString* date;
@property (nonatomic, copy) NSArray<storiesModel>* stories;
@property (nonatomic, copy) NSArray<top_StoriesModel>* top_stories;
@end
GetModel.m
#import "GetModel.h"@implementation GetModel+ (BOOL)propertyIsOptional:(NSString *)propertyName {return YES;
}@end@implementation storiesModel
+ (BOOL)propertyIsOptional:(NSString *)propertyName {return YES;
}
@end@implementation top_StoriesModel+ (BOOL)propertyIsOptional:(NSString *)propertyName {return YES;
}@end
在GetModel.m中使用+ (BOOL)propertyIsOptional:(NSString *)propertyName方法来指定模型类中的属性是否为可选的。默认情况下,所有的属性都被认为是必需的,也就是说在 JSON 数据中必须存在对应的键值。但是,也可以重写该方法并返回 YES 或 NO 来指定特定属性是否可以在 JSON 数据中不出现。
二、单例类和Block传值
在iOS开发中,一般要通过一些管理类来封装特定的属性或成员变量,这时就可以用单例类来实现。原因是单例类在程序运行时只创建一次,当程序结束后才被销毁,这样会提高运行效率并且降低代码风险,但是实现单例类时又需要考虑线程安全问题,所以这里用到GCD写法来创建单例类。
在Manager.h中声明类方法
+(instancetype)sharedSingleton;
在Manager.m中定义一个局部全局变量并实现接口部分声明的类方法。
static Manager* manager = nil;
+ (instancetype)sharedSingleton {if (manager == nil) {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{manager = [[Manager alloc] init];});}return manager;
}
dispatch_ once _t: 使用 dispatch_once 方法能保证某段代码在程序运行过程中只被执行 1 次,并且即使在多线程的环境下,dispatch _once也可以保证线程安全。
在单例类中要封装网络请求并实现传值,因此需要用到Block传值
在Manager.h中定义两个Block块来接收请求到的数据并声明一个方法来封装网络请求
typedef void (^GetModelBlock)(GetModel * _Nullable mainModel);
typedef void (^ErrorBlock)(NSError * _Nullable error);
- (void)NetWorkGetWithData:(GetModelBlock)mainModelBlock andError:(ErrorBlock)errorBlock;
在Manager.m中实现该方法
- (void)NetWorkGetWithData:(GetModelBlock)mainModelBolck andError:(ErrorBlock)errorBlock {//创建一个网络请求NSString *json = @"https://news-at.zhihu.com/api/4/news/latest";json = [json stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];NSURL *netWorkDataURL = [NSURL URLWithString:json];NSURLRequest *netWorkDataRequest = [NSURLRequest requestWithURL:netWorkDataURL];//创建请求会话NSURLSession *netWorkDataSession = [NSURLSession sharedSession];//根据会话创建任务NSURLSessionDataTask *netWorkDataTask = [netWorkDataSession dataTaskWithRequest:netWorkDataRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (error == nil) {GetModel *allGetData = [[GetModel alloc] initWithData:data error:nil];//使用Block传值mainModelBolck(allGetData);} else {errorBlock(error);}}];//启动任务[netWorkDataTask resume];
}
在主函数中
[[Manager sharedSingleton] NetWorkGetWithData:^(GetModel * _Nullable mainModel) {NSLog(@"%@", mainModel.stories[1]);NSLog(@"获取成功");} andError:^(NSError * _Nullable error) {NSLog(@"请求失败");}];
运行结果如下:

相关文章:
【iOS】——用单例类封装网络请求
文章目录 一、JSONModel1.JSONModel的简单介绍2.JSONModel的使用 二、单例类和Block传值 一、JSONModel 1.JSONModel的简单介绍 JSONModel一个第三方库,这个库用来将网络请求到的JSON格式的数据转化成Foundation框架下的Model类的属性,这样我们就可以直…...
再学Blazor——概述
简介 Blazor 是一种 .NET 前端 Web 框架,同时支持服务器端呈现和客户端交互性。 使用 C# 语言创建丰富的交互式 UI共享前后端应用逻辑可以生成混合桌面和移动应用受益于 .NET 的性能、可靠性和安全性需要有 HTML、CSS、JS 相关基础(开发 UI 框架的话&a…...
Ceph运维笔记
Ceph运维笔记 一、基本操作 ceph osd tree //查看所有osd情况 其中里面的weight就是CRUSH算法要使用的weight,越大代表之后PG选择该osd的概率就越大 ceph -s //查看整体ceph情况 health_ok才是正常的 ceph osd out osd.1 //将osd.1踢出集群 ceph osd i…...
RTSP协议
1 前言 RTSP协议作为音视频实时监控一个非常重要的协议,具有非常广泛的应用。RTSP由RFC 2326规范化,它允许客户端通过请求不同的媒体资源来控制流媒体服务器。RTSP是一种应用层协议,通常基于TCP连接,用于建立和控制媒体会话。这使…...
Maven系列第6篇:生命周期和插件详解?
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第6篇。 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。 前面我们使用maven…...
【通义千问】大模型Qwen GitHub开源工程学习笔记(4)-- 模型的量化与离线部署
摘要: 量化方案基于AutoGPTQ,提供了Int4量化模型,其中包括Qwen-7B-Chat和Qwen-14B-Chat。更新承诺在模型评估效果几乎没有损失的情况下,降低存储要求并提高推理速度。量化是指将模型权重和激活的精度降低以节省存储空间并提高推理速度的过程。AutoGPTQ是一种专有量化工具。…...
2022最新版-李宏毅机器学习深度学习课程-P23 为什么用了验证集结果还是过拟合
用了验证集还有可能会过拟合 这个片段可以从理论上证明这一点 以上整个挑选模型的过程也可以想象为一种训练。 把三个模型导出的最小损失公式看成一个集合,现在要做的就是在这个集合中找到某个h(此处可以视为训练),使得在验证集…...
Spring Cloud Alibaba—Sentinel 控制台安装
1、Sentinel 控制台包含如下功能: 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最…...
基于动物迁徙优化的BP神经网络(分类应用) - 附代码
基于动物迁徙优化的BP神经网络(分类应用) - 附代码 文章目录 基于动物迁徙优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.动物迁徙优化BP神经网络3.1 BP神经网络参数设置3.2 动物迁徙算法应用 4.测试结果…...
一键搞定!黑群晖虚拟机+内网穿透实现校园公网访问攻略!
文章目录 前言本教程解决的问题是:按照本教程方法操作后,达到的效果是前排提醒: 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机:1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…...
【C语言】——通讯录(静态-动态增长-文件储存)
目录 前言: 一:整体框架 关于通讯录结构体的创建 二:通讯录的功能实现(静态) 2.1初始化通讯录 2.2增加联系人 2.3打印通讯录 2.4删除联系人 2.5 查找联系人 2.6修改联系人 2.7排序联系人 三:通…...
win10安装nginx及简单使用(命令)
下载 下载地址:http://nginx.org/en/download.html 使用 解压 更改配置 conf目录下nginx.conf 修改为未被占用的端口,地址改成你的地址 server {# 监听端口 listen 9010;# 地址 server_name 127.0.0.1;# 静态资源location / {root html;i…...
【农业生产系统模型】基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术
随着数字农业和智慧农业的发展,基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…...
金融数学方法:梯度下降法
1.算法介绍 梯度下降法是一种常用的优化算法,其通过沿着梯度下降的方向迭代寻找局部极小值。如果沿着梯度上升的方向迭代,就可以找到极大值。 在梯度下降法中,我们首先需要选择一个初始点 x 0 x_0 x0作为起始位置,然后计算当前位…...
1031 查验身份证
一.问题: 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4…...
如何共享 Android 不同模块的构建配置
最近想重新梳理学习一遍 Android 的各个知识点,于是新建了一个 AndroidStudy 项目仓库,打算每个知识块新建 1 个 module。 类似这样: AndroidStudy (Root Project) ├─app (Module0) ├─CustomView (Module1) ├─KotlinCoroutines (Modul…...
atlas运维中遇到的问题
1、java.lang.NoClassDefFoundError:javax/ws/rs/core/Link$Builder 主要原因:jsr311-api包中javax.ws.rs.core包中没有Link类,而Atlas以HBase作为元数据存储,HBase本身使用的为javax.ws.rs-api包中的core包,其中有Lin…...
06-React的路由
06-React的路由 1.相关理解 1).SPA的理解 单页Web应用(single page web application,SPA)。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面,只会做页面的局部更新。数据都需要通过ajax请求获取, 并在前端异步展现。…...
虹科方案 | 加州理工学院利用HK-TrueNAS开展地震研究
一、客户背景 加州理工学院(CalTech)是世界顶尖的理工类科学研究型学府之一。加州理工学院地震实验室是加州理工学院地质与行星科学部(GPS)的一个分支机构,成立于1921年,自20年代以来一直是世界地震学研究中心,并且几十年来一直是媒体对大地…...
宝塔面板部署express以及MySql项目
第一次在宝塔面板上部署express和MySql项目,部署过程一直跑不通接口,特此记录一下。 在部署的时候,建议第一步把数据库MySql给跑通,中间好多原因是由于数据库的原因给引起的。 一.连接数据库 (1)在宝塔面…...
解锁AI原生应用领域多代理系统的潜力
解锁AI原生应用领域多代理系统的潜力 关键词:多代理系统(MAS)、AI原生应用、智能体(Agent)、协作式AI、涌现行为 摘要:在AI从“工具辅助”向“原生驱动”进化的今天,多代理系统(Multi-Agent System, MAS)正成为构建复杂智能应用的核心引擎。本文将通过生活类比、技术原…...
OpenClaw+GLM-4.7-Flash:3步实现自动化邮件处理
OpenClawGLM-4.7-Flash:3步实现自动化邮件处理 1. 为什么需要自动化邮件处理? 每天早晨打开邮箱,看到堆积如山的未读邮件时,那种窒息感我太熟悉了。作为技术团队的接口人,我的邮箱常年保持着200未读邮件的状态——有…...
MobaXterm远程连接:管理Baichuan-M2-32B-GPTQ-Int4服务器
MobaXterm远程连接:管理Baichuan-M2-32B-GPTQ-Int4服务器 1. 为什么选择MobaXterm来管理大模型服务器 部署Baichuan-M2-32B-GPTQ-Int4这样的医疗增强推理模型,通常需要在Linux服务器上运行vLLM或SGLang等推理引擎。这类服务对系统资源要求高࿰…...
HunyuanVideo-Foley 安全与权限管理:企业内网API访问控制实践
HunyuanVideo-Foley 安全与权限管理:企业内网API访问控制实践 1. 企业AI服务的安全挑战 随着AI技术在企业内部的广泛应用,视频处理类API的安全管理成为IT部门的新课题。HunyuanVideo-Foley作为专业的音视频处理工具,在私有化部署场景下需要…...
当水力裂缝撞上天然裂缝:用COMSOL相场法重现‘海马尾巴’般的转向路径
当水力裂缝邂逅天然裂缝:COMSOL相场法中的"海马尾巴"转向现象解析 在油气田开发领域,水力压裂技术正经历着从经验驱动到数字仿真的范式转变。相场法作为断裂力学模拟的前沿方法,以其独特的"无预设路径"优势,…...
用Python+OpenCV给斗地主做个‘外挂’:手把手教你写个桌面记牌器(附源码)
PythonOpenCV实战:打造智能斗地主记牌工具 记得去年宿舍通宵打牌时,室友总抱怨记不住出过的牌。作为计算机系学生,我琢磨着能否用课堂学的OpenCV做个记牌工具。三周后,当这个能自动识别桌面上扑克牌的小程序成功运行时,…...
太阳光模拟器的光源类型及标准分类
太阳光模拟器是可精准复现自然太阳光光谱、辐照强度性的核心测试设备,广泛应用于光伏测试、材料老化、航空航天等多个领域,为各类光敏工艺和材料的室内可控测试提供重要支撑。下文,紫创测控luminbox将从光源脉冲时间、IEC等级标准、光源种类以…...
告别局域网限制:用C-Lodop插件实现前端跨网段远程打印(保姆级配置指南)
突破物理边界:C-Lodop实现跨地域打印的工程实践 想象一下这样的场景:上海分公司的财务人员需要紧急打印一份合同,而唯一具备公章权限的打印机在北京总部。传统方案可能需要邮件转发、本地打印再扫描,或者依赖复杂的VPN配置——但现…...
Docker快速搭建个人开源导航站:从配置到公网访问
1. 为什么你需要一个个人导航站? 每天打开浏览器,你是不是也和我一样要反复输入那些常用的网址?GitHub、技术论坛、在线工具网站...收藏夹早就塞得乱七八糟。更糟的是换了电脑或手机,所有收藏都得重新整理。三年前我开始用自建导…...
圣女司幼幽-造相Z-Turbo开发利器:VS Code与GitHub高效协作配置
圣女司幼幽-造相Z-Turbo开发利器:VS Code与GitHub高效协作配置 最近在折腾圣女司幼幽-造相Z-Turbo这个项目,发现团队协作效率是个大问题。代码在本地改完,传到服务器上跑,结果不对,又得拉下来改,一来二去时…...
