当前位置: 首页 > news >正文

【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 对象,通常是一个 NSDictionaryNSArray,取决于 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 服务器&#xff0c;可以接受多个客户端连接&#xff0c;然后持续接收客户端发送的信息&#xff0c; 最后将接收到的信息再发送回客户端 。 源码 头文件&#xff08;TCPServerTest.h&#xff09; #include <iostream> #include <winsock2.h&g…...

每天练打字6:今日状况——常用字后五百击键3第2遍已完成,赛文速度93.56

今日跟打&#xff1a;763字 &#xff08;截至当前&#xff09; 总跟打&#xff1a;120408字 记录天数&#xff1a;2467天 &#xff08;实际没有这么多天&#xff0c;这个是注册账号的天数&#xff09; 平均每天&#xff1a;48字 本周目标完成进度&#xff1a; 练习常用单字后5…...

rk3568创建基于Ubuntu18.04交叉编译遇到的坑

尽管配置过rk3288&#xff0c;觉得rk3568也不会有啥问题&#xff0c;但还是掉坑了。 一、安装依赖库 安装完ubuntu后&#xff0c;先进行升级 sudo apt update sudo apt upgrade然后安装依赖库 $ sudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-…...

对“一个中心,三重防护”中安全管理中心的理解

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

jmeter用csv data set config做参数化1

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

软件分享 丨eSearch 截图软件

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

pytorh学习笔记——cifar10(一)生成数据

CIFAR&#xff08;Canadian Institute For Advanced Research&#xff09;是一个用于图像识别研究的数据集。CIFAR数据集包含多个子数据集&#xff0c;最常用的是CIFAR-10和CIFAR-100。 CIFAR-10数据集包含60000张32x32彩色图像&#xff0c;分为10个类别&#xff0c;每…...

pikachu靶场SSRF-curl测试报告

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

Java项目-基于Springboot的农机电招平台项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…...

Systemd:简介

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

Snapshot包和Release包区别

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

最近网站频繁跳转到黑产网站,怀疑是51.la统计代码的问题

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

【python_修改PPT中字体,run.font.name只对英文生效怎么办?】

python_修改PPT中字体&#xff0c;run.font.name只对英文生效怎么办&#xff1f; 参考&#xff1a;使用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 如果没有驱动&#xff0c;先下载驱动 填写数据库用户名密码 勾选对应的表即可 JDBC代码流程 1,配置信息 2,加载驱动 从MySQL Connector/J 5.1版本开始&#xff0c;推荐使用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 中&#xff0c;元素可以被定义为简单类型或复杂类型。简单类型元素不能包含其他元素或属性&#xff0c;而复杂类型元素可以包含其他元素、属性或两者都有。复合空元素是一种特殊类型…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...