【iOS】使用单例封装通过AFNetworking实现的网络请求

这里写目录标题

  • 前言
  • 单例封装网络请求
    • 1. 首先创建一个继承于NSObject的单例类,笔者这里以Manager对单例类进行命名,然后声明并实现单例类的初始化方法
    • 2.实现完单例的创建方法后我们即可通过`AFNetworking`中的`GET`方法进行网络请求
    • 3.在Controller文件中创建单例并执行网络请求的方法


前言

先前在天气预报中笔者用到了Foundation框架中原生的网络请求类NSURLSession,我们先来看一下我们通过NSURLSession请求网络数据的示例:

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];request.HTTPMethod = @"GET";[request setValue:@"application/json" forHTTPHeaderField:@"Conten-Type"];NSURLSession *session = [NSURLSession sharedSession];NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if(error){NSLog(@"error = %@",error);}else{NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];NSLog(@"dic = %@",dic);}}];[task resume];

接下来我们再看一下通过AFNetworking如何进行网络请求:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];[manager GET:url parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {NSLog(@"responseObject = %@",responseObject);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {if (error) {NSLog(@"error = %@",error);}}];

这样一对比,很显然通过AFNetworking实现网络请求需要的代码量更少

接下来笔者会通过示例具体讲解使用单例封装通过AFNetworking实现的网络请求

单例封装网络请求

在介绍单例封装网络请求的用法前,我们先来讲解一下我们为什么要使用单例来封装网络请求:

在先前的天气预报中,因为有许多个页面,每个页面中都需要从网络中请求数据,因此笔者就创建多个对象来请求不同的网络数据,但是这无疑浪费了内存,如果有一个单例专门负责进行网络请求,就不会出现这样的问题,

同时将网络请求逻辑封装到一个单例类中,这个类负责创建、管理和发送网络请求。这样,你可以将网络请求的相关代码集中在一个地方,以提高代码的可维护性和可读性。

接下来笔者将通过示例讲解这方面的知识:

1. 首先创建一个继承于NSObject的单例类,笔者这里以Manager对单例类进行命名,然后声明并实现单例类的初始化方法

.h文件:
在这里插入图片描述

.m文件:

//创建一个单例
static Manager *managerSington = nil;@implementation Manager+ (instancetype)shareManager {if (!managerSington) {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{managerSington = [[Manager alloc] init];});}return managerSington;
}

在这里创建单例笔者使用了GCD,GCD在此的作用是确保代码块只被执行一次。这是线程安全的,即使在多线程环境下也不会出现问题。

static dispatch_once_t onceToken;:这是用于确保代码块只执行一次的GCD的dispatch_once_t变量。

dispatch_once(&onceToken, ^{ ... }):这是GCD的dispatch_once函数,它接受一个 dispatch_once_t 变量和一个代码块作为参数。它确保代码块中的代码只会在第一次调用时执行,以后的调用会被忽略。

2.实现完单例的创建方法后我们即可通过AFNetworking中的GET方法进行网络请求

- (void)NetWorkGetWithData:(id)TestModelBolck andError:(id)errorBlock {AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];NSString *url = @"https://news-at.zhihu.com/api/4/version/ios/2.3.0";[manager GET:url parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {TestModel2 *testModel = [[TestModel2 alloc] initWithDictionary:responseObject error:nil];mainModelBolck(testModel);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"Error: %@", error);}];
}

我们接下来分析一下GET方法的源码对其进行解析:

- (NSURLSessionDataTask *)GET:(NSString *)URLStringparameters:(nullable id)parametersheaders:(nullable NSDictionary <NSString *, NSString *> *)headersprogress:(nullable void (^)(NSProgress * _Nonnull))downloadProgresssuccess:(nullable void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))successfailure:(nullable void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
{NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"GET"URLString:URLStringparameters:parametersheaders:headersuploadProgress:nildownloadProgress:downloadProgresssuccess:successfailure:failure];[dataTask resume];return dataTask;
}

笔者在这里解释一下各个参数的含义

URLString(NSString类型):表示要发送GET请求的URL字符串,即请求的目标地址。
parameters(可选的id类型):包含GET请求的参数,这些参数会附加到URL字符串中,以便服务器可以根据这些参数返回相应的数据。它通常是一个NSDictionary或其他数据结构,其中包含键值对,表示请求参数。
headers(可选的NSDictionary类型):包含HTTP请求头的字典。HTTP请求头通常包含与请求相关的信息,例如授权令牌、用户代理、接受的数据类型等。这里的参数允许你自定义请求头。
downloadProgress(可选的NSProgress类型块):一个块对象,用于跟踪下载进度。这个块会在下载数据时被调用,可以用来更新UI或记录下载进度等。
success(可选的块):一个成功回调块,当请求成功完成时会被调用。这个块通常接受两个参数,第一个参数是包含响应数据的NSURLSessionDataTask对象,第二个参数是响应数据,通常是一个NSDictionary或其他数据结构。
failure(可选的块):一个失败回调块,当请求失败时会被调用。这个块通常接受两个参数,第一个参数是包含请求任务信息的NSURLSessionDataTask对象,第二个参数是一个NSError对象,包含了关于请求失败的信息。
在这个方法内部,首先通过调用dataTaskWithHTTPMethod:URLString:parameters:headers:uploadProgress:downloadProgress:success:failure:方法创建一个NSURLSessionDataTask对象,然后使用resume方法开始执行这个任务(发送GET请求),最后返回该任务对象,以便调用者可以对任务进行进一步操作或取消。

关于AFNetworking的源码以后还会深度学习,在GET方法中需要注意的是当我们请求成功后返回的id _Nullable responseObject,这个参数是响应数据,通常是一个NSDictionary或其他数据结构。我们通过将responseObject赋值给我们的JSONModel对象即可得到我们从网络中请求到的数据

当我们成功请求到数据并将其放入我们的对象后,我们通过Block传值将其对象传递给到我们的其他文件中

typedef void (^TestModelBlock) (TestModel2 *model);
typedef void (^TestModelBlockElse) (TestModel3 *model);

然后在实现文件中进行代码块的传递:

    [manager GET:url parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {TestModel2 *testModel = [[TestModel2 alloc] initWithDictionary:responseObject error:nil];mainModelBolck(testModel);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"Error: %@", error);}];

3.在Controller文件中创建单例并执行网络请求的方法

    [[Manager shareManager] NetWorkGetWithData:^(TestModel2 *TestModelBolck) {NSLog(@"%@",TestModelBolck);NSLog(@"请求成功");} andError:^(NSError * _Nullable error) {NSLog(@"失败");}];

综合以上这三步我们就成功使用单例封装通过AFNetworking实现的网络请求

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android12之DRM架构(一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Docker是一个流行的容器化平台,用于构建、部署和运行应用程序。

文章目录 Web应用程序数据库服务器微服务应用开发环境持续集成和持续部署 (CI/CD)应用程序依赖项云原生应用程序研究和教育 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;…

移动App安全检测的必要性,app安全测试报告的编写注意事项

随着移动互联网的迅猛发展&#xff0c;移动App已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;虽然App给我们带来了便利和乐趣&#xff0c;但也伴随着一些潜在的安全风险。黑客、病毒、恶意软件等威胁着用户的隐私和财产安全&#xff0c;因此进行安全检测就显得尤为…

【广州华锐互动】利用AR进行野外地质调查学习,培养学生实践能力

在科技发展的驱动下&#xff0c;AR&#xff08;增强现实&#xff09;技术已经在许多领域中找到了应用&#xff0c;包括医疗、教育、建筑和娱乐等。然而&#xff0c;有一个领域尚未充分利用AR技术的潜力&#xff0c;那就是野外地质调查。通过将AR技术引入到这个传统上需要大量人…

CUDA编程入门系列(一) 什么是GPU运算?

一、GPU架构 下图为Tesla C2050的GPU架构&#xff0c;其核心由16个组所构成&#xff0c;其中红色方框为单个组的示例&#xff0c;称为SM(Stream Multiprocessor), 每个SM里面又有32个SP&#xff08;Stream Processor&#xff09;&#xff08;即小绿快&#xff09; 下图为Fermi的…

01认识微服务

一、微服务架构演变 1.单体架构 将所有的功能集中在一个项目开发&#xff0c;打成一个包部署。优点架构简单&#xff0c;部署成本低。缺点耦合度高&#xff0c;不利于大型项目的开发和维护 2.分布式架构 根据业务功能对系统进行拆分&#xff0c;每个业务模块作为独立的项目…

核酸管外观缺陷检测(二)

1.1应用示例思路 (1)创建分类器&#xff1b; (2)向分类器中添加样本&#xff1b; (3)训练分类器&#xff1b; (4) 测试数据&#xff0c;并将检测结果写入txt文件中。 1.2 应用示例相关算子介绍 (1) create_class_mlp( : : NumInput, NumHidden, NumOutput, OutputFunctio…

Flow深入浅出系列之在ViewModels中使用Kotlin Flows

Flow深入浅出系列之在ViewModels中使用Kotlin FlowsFlow深入浅出系列之更聪明的分享 Kotlin FlowsFlow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 Flow深入浅出系列之在ViewModels中使用Kotlin Flows Flow出现后&#xff0c;LiveData仍然可以用&#xff0c;并且…

进阶JAVA篇-异常处理:解读与解决编程中的意外情况

目录 1.0 什么是异常&#xff1f; 1.1 异常主要分为两个情况分别是运行时异常、编译时异常。 2.0 怎么处理异常呢&#xff1f; 2.1 捕获异常&#xff08;Catch Exception&#xff09; 2.2 声明异常&#xff08;Declare Exception&#xff09; 3.0 自定义异常 3.1 如何定义异常类…

第60节——使用redux-toolkit实战一个商品列表的增删查改

一、样例 二、需求 调用goods.js这个单例完成对goods数据的增删查改 class Goods {constructor() {const data localStorage.getItem("qf-goods-data");this.goods data ? JSON.parse(data) : [];}time 500;/*** 获取商品* returns*/getGoods() {return new Pr…

spring6-资源操作:Resources

资源操作&#xff1a;Resources 1、Spring Resources概述2、Resource接口3、Resource的实现类3.1、UrlResource访问网络资源3.2、ClassPathResource 访问类路径下资源3.3、FileSystemResource 访问文件系统资源3.4、ServletContextResource3.5、InputStreamResource3.6、ByteAr…

联合体(共用体)

1. 联合类型的定义 联合也是一种特殊的自定义类型。 这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间。 2.联合大小的计算 联合的大小 至少是最大成员的大小 。 当最大成员大小不是最大对齐数的整数倍的时候&#xff0c;就要对 齐到最大对齐数…