【iOS】使用一个单例通过AFNetworking来实现网络请求
【iOS】使用一个单例通过AFNetworking来实现网络请求
文章目录
- 【iOS】使用一个单例通过AFNetworking来实现网络请求
- 前言
- OC网络请求的流程
- 使用单例的原因
- 创建一个单例
- 采用AFNetworking的网络申请
- 小结
前言
笔者这周主要学习了第三方库AFNetworking的使用,这里笔者简单介绍一下有关于AFNetworking这个第三方库的使用,在这之前我们先重新复习一下有关OC网络请求的内容。
OC网络请求的流程
在暑假的天气预报项目中笔者简单使用了有关网络请求的内容:
- 创建请求地址
- 创建请求类
- 创建会话
- 根据会话创建任务
- 启动任务
网络请求主要分为上面五个步骤,下面笔者就直接给出代码:
//创建请求地址,笔者这里是传入了一个城市的一个strId,这样才可以构成一个完整的请求地址。NSString* urlString = [NSString stringWithFormat: @"https://geoapi.qweather.com/v2/city/lookup?location=%@&key=2211750bdc834763ba3c5f57ce98c307", self.search.text];NSURL *url = [NSURL URLWithString:urlString];
//创建请求类
NSURLRequest* request = [NSURLRequest requestWithURL:url];//通过URL创建一个网络请求类
//创建会话
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//根据会话创建任务。
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (error) {NSLog(@"error = %@", error.localizedDescription);} else {[self.locationArray removeAllObjects];NSDictionary* second = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];NSMutableArray* timeAry = [[NSMutableArray alloc] init];timeAry = second[@"location"];//NSLog(@"%@", timeAry);NSLog(@"geo");for (NSDictionary* current in timeAry) {[self.locationArray addObject:current];}}}];
//启动任务
[dataTask resume];
详情可以看笔者的这篇博客暑假第三周任务——天气预报,在本篇博客中笔者主要介绍一下有关于我们第三方库的使用,以及采用单例来实现网络请求。
使用单例的原因
在暑假的天气预报项目中间,每个页面都要去实现网络请求,所以我们会在每个页面都创建对象,这里在实际开发中浪费了很多内存,假设我们采用一个单例来统一申请网络请求,就可以节省内存,这就是在申请网络请求的时候采用单例模式的原因之一。其次,我们完成一个项目,而我们将网络请求的内容全部放在单例这个类中,可以让这个项目更加利于我们维护,提高代码的可维护性。
创建一个单例
在之前的学习中,我们学习过单例模式的创建,这里我们就需要用到这部分知识。
static Manger *mangerSington = nil;
@implementation Manger
+ (instancetype) sharedSingleton {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{mangerSington = [[super allocWithZone:NULL] init];});return mangerSington;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {return [Manger sharedSingleton];
}
这里采用的单例创建,是我们之前学习的内容,这里就不多赘述了,主要就是static dispatch_once_t onceToken;:
这是用于确保代码块只执行一次的GCD的dispatch_once_t
变量。从而保证在多线程情况下保证了创建只会执行一次。
采用AFNetworking的网络申请
一般我们的项目采用MVC架构,所以我们申请一个对应的网络请求,需要返回一个model,也就是我们从网络上获取到的JSON数据,我们一般获取到的数据存储在model层,然后这里我们需要一个block,将我们通过网络请求获取到的JSON数据传输给页面用于加载数据。
//在.h文件中,定义给block命名:typedef void(^successBlock)(testModel* testModel);
- (void) NetWorkWithData:(successBlock)success andError:(errorBlock)myerror {AFHTTPSessionManager* manger = [AFHTTPSessionManager manager];NSString* str = @"https://news-at.zhihu.com/api/4/version/ios/2.3.0";[manger GET:str parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {testModel* model = [testModel yy_modelWithJSON:responseObject];success(model);//给页面部分返回该页面需要的model。} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {myerror(error);}];
}
这里是我们首先我们这里先解释一下有关GET方法请求数据的几个参数:
- 第一个参数是存放我们的URL,也就是我们的网络请求的地址。
- 第二个参数则是我们要发送的请求的查询数据,在get请求中我们一般放在URL中间,这里注意下在POST请求,我们需要使用一个字典来进行一个请求。
- 第三个参数则是header,在大部分请求中我们是不需要的,但是在部分要求比较严格的API中,可能就需要运用到这个参数
- 第四个参数是一个可以选择的块,一般用于大文件的下载中
- success则是请求成功后回调块,failure则是请求失败后的回调块
这里的responseObject一般情况下是responseObject
将是一个 Objective-C 对象,通常是一个 NSDictionary
或 NSArray
,取决于 JSON 的结构。
这里我们定义两个我们通过网络请求申请到的数据放在block中,将里面的内容传递到对应的页面。
typedef void(^successBlock)(NSDictionary* tokenModel);
typedef void(^myError)(NSError* error);
在viewController中进行网络请求,这样就可以获得我们所需要的内容。
- (void)viewDidLoad {[super viewDidLoad];id manger = [Manger sharedSingleton];[manger NetWorkWithData:^(testModel * _Nonnull testModel) {NSLog(@"%@", [testModel yy_modelToJSONString]);} andError:^(NSError * _Nonnull error) {NSLog(@"error:%@", error);}];// Do any additional setup after loading the view.
}
打印结果:
{"msg":"【更新内容】\r\n\r\n★ 多图有标记 流量壕忽略\r\n★ 出门前离线 没网也能看\r\n★ 喜欢请好评 不喜快吐槽\r\n★ 萌妹工程师 邮箱在下面\r\nmua@zhihu.com\r\n(一般人我们不告诉他)","stauts":0,"latest":"2.5"}
Type: Notice | Timestamp: 2024-10-19 23:00:47.244886+08:00 | Process: test2 | Library: test2 | TID: 0x147365d
小结
这里笔者简单的介绍了有关AFN这个第三方库的使用,以及使用一个单例来封装网络请求,从而提高代码的内聚性,便于后期的代码维护。
相关文章:

【iOS】使用一个单例通过AFNetworking来实现网络请求
【iOS】使用一个单例通过AFNetworking来实现网络请求 文章目录 【iOS】使用一个单例通过AFNetworking来实现网络请求前言OC网络请求的流程 使用单例的原因创建一个单例采用AFNetworking的网络申请 小结 前言 笔者这周主要学习了第三方库AFNetworking的使用,这里笔者…...

如何从模块内部运行 Pytest
在 Python 中,pytest 是一个强大的测试框架,用于编写和运行测试用例。通常我们会在命令行中运行 pytest,但是有时你可能希望从模块或脚本的内部运行 pytest,比如为了自动化测试或集成到某个工作流程中。 1、问题背景 当你从模块…...

oracle数据库---基本查询(单表查询、多表查询、子查询、分页查询、oracle内置函数、行列转换、集合运算)
思维导图 单表查询 数据准备 -- 练习的表如果存在 请先删除 -- 如果不存在直接创建 drop table t_owners;--业主表 create table t_owners (id number primary key,name varchar2(30),addressid number,housenumber varchar2(30),watermeter varchar2(30),adddate date,owner…...

web API基础
作用和分类 作用: 就是使用 JS 去操作 html 和浏览器 分类: DOM (文档对象模型)、 BOM (浏览器对象模型) 什么是DOM DOM (Document Object Model) 译为文档对象模型,是 HTML 和 XML 文档的编程接口。 HTML DOM 定义了访问和操作 …...

【C++】创建TCP服务端
实现了一个基本的 TCP 服务器,可以接受多个客户端连接,然后持续接收客户端发送的信息, 最后将接收到的信息再发送回客户端 。 源码 头文件(TCPServerTest.h) #include <iostream> #include <winsock2.h&g…...

每天练打字6:今日状况——常用字后五百击键3第2遍已完成,赛文速度93.56
今日跟打:763字 (截至当前) 总跟打:120408字 记录天数:2467天 (实际没有这么多天,这个是注册账号的天数) 平均每天:48字 本周目标完成进度: 练习常用单字后5…...

rk3568创建基于Ubuntu18.04交叉编译遇到的坑
尽管配置过rk3288,觉得rk3568也不会有啥问题,但还是掉坑了。 一、安装依赖库 安装完ubuntu后,先进行升级 sudo apt update sudo apt upgrade然后安装依赖库 $ sudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-…...

对“一个中心,三重防护”中安全管理中心的理解
安全管理中心 本控制项为网络安全等级保护标准的技术部分。本项主要包括系统管理、审计管理、安全管理和集中管控四个控制点,其中的集中管控可以说是重中之重,主要都是围绕它来展开的。 28448基本要求中安全管理中心 8.1.5 安全管理中心 8.1.5.1 系统…...

jmeter用csv data set config做参数化1
在jmeter中,csv data set config的作用非常强大,用它来做批量测试和参数化非常好用。 csv data set config的常用配置项如下: Variable Names处,写上源文件中的参数名,用于后续接口发送请求时引用 Ignore first line…...

软件分享 丨eSearch 截图软件
在日常的工作和学习中,截图是一项非常常见且重要的操作。无论是记录重要的信息、制作教程,还是与他人分享有趣的内容,一款好用的截图软件都能让我们的效率大大提高。今天,就给大家分享一款功能强大的截图软件 - eSearch。 一、强…...

pytorh学习笔记——cifar10(一)生成数据
CIFAR(Canadian Institute For Advanced Research)是一个用于图像识别研究的数据集。CIFAR数据集包含多个子数据集,最常用的是CIFAR-10和CIFAR-100。 CIFAR-10数据集包含60000张32x32彩色图像,分为10个类别,每…...

pikachu靶场SSRF-curl测试报告
目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、实现ssrf攻击 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机:本机(127.0.0.1) 靶 机:本机(127.0.0.1) 2、使用工具/软件 测试网址:…...

Java项目-基于Springboot的农机电招平台项目(源码+说明).zip
作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...

Systemd:简介
1号进程 Systemd是linux系统的守护进程,它要管理正在运行的 Linux 主机的许多方面,包括挂载文件系统、管理硬件、处理定时器以及启动和管理生产性主机所需的系统服务。 $ ps -u -p 1 USER PID %CPU %MEM VSZ RSS TTY STAT START TI…...

Snapshot包和Release包区别
Snapshot包和Release包区别 Snapshot包: 代表开发中的版本,可能不稳定。 经常更新,包含最新的功能和修复。 通常用于测试和开发阶段。 Release包: 代表稳定的、经过全面测试的版本。 版本号通常是固定的,适合生产环…...

最近网站频繁跳转到黑产网站,怀疑是51.la统计代码的问题
最近我的几个网站,都出现了一个问题,就是访问的时候会莫名其妙的跳转到黑产网站。 通过排查了网页代码,发现网页都有一个共同点,就是使用了51.la统计。为什么会怀疑是51la统计代码问题?因为我的网页只有统计代码外没有…...

【python_修改PPT中字体,run.font.name只对英文生效怎么办?】
python_修改PPT中字体,run.font.name只对英文生效怎么办? 参考:使用pptx_ea_font库设置中文字体 from pptx import Presentation from pptx.util import Pt from pptx_ea_font import set_font# 打开现有的 PPT 文件 prs Presentation(D:\…...

【web】JDBC
项目连接数据库 右侧导航栏找到databsae 如果没有驱动,先下载驱动 填写数据库用户名密码 勾选对应的表即可 JDBC代码流程 1,配置信息 2,加载驱动 从MySQL Connector/J 5.1版本开始,推荐使用com.mysql.cj.jdbc.Driver这个新的驱动类。 3,链接数据库…...

MATLAB代码介绍:一段轨迹的指纹定位,KNN,三维,四个锚点(附源代码,可复制粘贴)
文章目录 产品介绍:三维指纹定位 KNN MATLAB 模型概述源代码运行结果功能亮点代码结构应用场景结论产品介绍:三维指纹定位 KNN MATLAB 模型 概述 本 MATLAB 代码实现了一种基于 KNN(K-Nearest Neighbors)算法的三维指纹定位系统,利用四个基站(锚点)信号强度进行移动终…...

XML Schema 复合空元素
XML Schema 复合空元素 XML Schema 是一种用于定义 XML 文档结构和内容的语言。在 XML Schema 中,元素可以被定义为简单类型或复杂类型。简单类型元素不能包含其他元素或属性,而复杂类型元素可以包含其他元素、属性或两者都有。复合空元素是一种特殊类型…...

Java面向对象编程基础(二)
Java面向对象编程基础二 一、package与import关键字的使用1.说明2.包的作用3.JDK中主要的包4. import5.import关键字的使用 二、封装性1.为什么要封装?2.如何封装?3.作用4.权限修饰符的权限大小5.案例 三、构造器1 构造器的使用说明2 案例: 四、实例变量赋值过程1 …...

[PHP]重复的Notice错误信息
<?php $a []; var_dump($a[name]);执行结果: 原因: display_errors和error_reporting都打开了Notice错误信息...

2024年第四届“网鼎杯”网络安全大赛-赛前模拟训练
文章目录 网络安全(WEB)签到题WEB01WEB02 二进制漏洞安全(PWN)PWN01潜在的安全漏洞分析攻击步骤exp 逆向工程(REVERSE)REVERSE01代码分析重构密码 密码学(CRYPTO)CRYPTO01CRYPTO02 杂…...

AI金融攻防赛:YOLO理论学习及赛题进阶思路(DataWhale组队学习)
引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何在金融场景凭证篡改检测中应用YOLO算法。我们将从模型概述、数据准备、训练流程以及模…...

Spring Security 基础配置详解(附Demo)
目录 前言1. 基本知识2. Demo3. 实战 前言 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 1. 基本知识 HttpSecurity 是 Spri…...

代码随想录打卡Day1
文章目录 day011 数组理论基础2 二分查找法3 移除元素4 平方数 day01 Java JDK是17.0.11 1 数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 数组下标都是从0开始的。 数组内存空间的地址是连续的。 因为数组在内存空间的地址是连续的,所以我们…...

Vue快速创建工程+Element Plus
创建Vue工程 执行命令 npm init vuelatest 执行这两个绿色的命令 执行这个命令启动 npm run dev Element 打开网站https://element-plus.org/zh-CN/ npm install element-plus --save 然后在vscode中打开你的项目工程 // main.ts import { createApp } from vue import Ele…...

汽车管理系统——主界面制作
目录 主界面需要有什么?然后要做什么?添加两个主菜单(声明)下一步应该干什么?能够跳转到文件有哪几个动作?动作如何声明?为什么用选择声明指针,不选择直接声明这个对象? …...

C++ 右值引用深入理解:特性、优化与底层
目录 一、左右值的概念及右值的种类 二、左值引用与右值引用 左值引用给右值取别名: 右值引用给左值取别名: 三、引用的意义及左值引用的场景 四、移动构造: 右值引用在底层里的实现: 一、左右值的概念及右值的种类 在 C …...

C# 文件操作
文章目录 文件系统FileInfo和DirectoryInfo类完成一个文件的拷贝判断一个文件是否存在FileInfo和DirectoryInfo的属性列表FileInfo和DirectoryInfo的方法列表读写文件文件系统 下面的类用于浏览文件系统和执行操作,比如移动,复制和删除文件。 System.MarshalByRefObject 这个…...