从架构设计的角度分析ios自带网络库和AFNetworking

news2024/11/18 0:21:58

总结(先说明文章分析出的一些‘认知’)

从本文中,我们可以总结出一些框架设计上的“认知”:

  • 对于通用的常规配置信息方面的设计,我们可以通过定义一个“类似于NSURLSessionConfiguration、NSURLRequest”的类来完成设计;
  • 对于生命周期的时机的通知,我们可以通过抽象出一个“类似于NSURLSessionDataDelegate”的协议来完成设计,此时对于框架的使用方来说,就可以根据这些“生命周期的时机的通知”来实现自己的各种各样的业务逻辑。(提升可扩展性)
  • 对于一些通用且常用的处理逻辑代码,我们直接以工具类的方式来完成设计。(降低重复开发的成本)

ios系统自带的网络库

因为AFNetworking是对ios系统自带的网络库的接口(比如NSURLSession)进行封装的,因此我们先了解系统自带的网络库,然后再了解AFNetworking。
学习网络库api的最好方法就是写个demo,所以,我们先来看一个demo。

Demo1

本demo是请求https://www.baidu.com,然后打印响应的数据。

  1. demo代码如下:
//D2VC是个UIViewController 
@interface D2VC () <NSURLSessionDataDelegate>
@property(nonatomic) NSMutableData *resultData;
@end
 
@implementation D2VC
 
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = UIColor.whiteColor;
    
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 100, 390, 60)];
    button.backgroundColor = UIColor.redColor;
    [button addTarget:self action:@selector(get) forControlEvents:UIControlEventTouchUpInside];
    [button setTitle:@"get请求" forState:UIControlStateNormal];
    [self.view addSubview:button];
}
 
- (void)get {
    //创建网络请求
    NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];
    NSURLRequest *reuqest = [NSURLRequest requestWithURL:url];
    //初始化请求响应的回调方法所在的队列
    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
    operationQueue.maxConcurrentOperationCount = 1;
    //初始化NSURLSession。第3个参数必须是个串行队列
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:operationQueue];
    //初始化一个请求任务
    NSURLSessionDataTask *task = [session dataTaskWithRequest:reuqest];
    //开始请求
    [task resume];
}
 
#pragma mark - NSURLSessionDataDelegate
 
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                 didReceiveResponse:(NSURLResponse *)response
 completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
    NSLog(@"%s, thread=%@。该方法是在你创建session时所传入的operationQueue中被调用的,所以如果你传的是mainQueue,那么该方法就会在UI线程执行。该方法被调用时,app就已经发生并收到响应了。。。如果你在该方法不调用completionHandler,那么下面的那两个方法就不会被执行!", __func__, [NSThread currentThread]);
    
    completionHandler(NSURLSessionResponseAllow); //调用该方法的目的是接收服务端的响应,此时下面的两个方法会被调用以便接收服务端的响应数据
    
    self.resultData = [NSMutableData data];
}
 
/* 
 接收到server响应的数据时被调用,如果数据很多,就会被调用多次
 */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
    didReceiveData:(NSData *)data {
    NSLog(@"%s, thread=%@.接收到服务端响应的data。该方法是在你创建session时所传入的operationQueue中被调用的,所以如果你传的是mainQueue,那么该方法就会在UI线程执行。接下来保存该data到resultData中", __func__, [NSThread currentThread]);
    [self.resultData appendData:data];
}
 
/* 
 请求完成时被回调,error表示成功或者失败
 */
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error {
    NSLog(@"%s, thread=%@", __func__, [NSThread currentThread]);
    if (!error) {
        NSLog(@"请求完成了,且请求成功.该方法是在你创建session时所传入的operationQueue中被调用的,所以如果你传的是mainQueue,那么该方法就会在UI线程执行。");
        NSLog(@"服务端响应的数据是:%@", [[NSString alloc] initWithData:self.resultData encoding:NSUTF8StringEncoding]);
    } else {
        NSLog(@"请求完成了,但请求失败了.该方法是在你创建session时所传入的operationQueue中被调用的,所以如果你传的是mainQueue,那么该方法就会在UI线程执行。,error=%@", error);
    }
}
 
@end
  1. 运行demo,然后点击请求按钮
    在这里插入图片描述
  2. 请求结果如下图。
    在这里插入图片描述

网络库的类关系图

根据上面demo用到的系统自带的网络相关的类及其关联的类,我们便可以梳理出目前ios的网络相关的类的关系如下图所示:
在这里插入图片描述
我们再结合本demo所使用的网络相关的类和协议来看看这些类或者协议所提供的功能。如下图,我们通过实现NSURLSessionDataDelegate协议来接收服务端返回的数据,并将其打印出来,使用NSURLSessionDataTask来发起“请求”,使用NSURLSession来获取请求任务(NSURLSessionDataTask),使用NSURLSessionConfiguration配置session的一些策略(比如请求超时时间),使用NSOperationQueue来让执行“NSURLSessionDataDelegate协议的实现方法”,使用NSURLRequest来配置请求策略(比如请求url)。
在这里插入图片描述
从本demo中,我们可以总结出,在框架的设计里面:对于通用的常规配置信息方面的设计,我们可以通过定义一个“类似于NSURLSessionConfiguration、NSURLRequest”的类来完成设计;对于生命周期的时机的通知,我们可以通过抽象出一个“类似于NSURLSessionDataDelegate”的协议来完成设计,此时对于框架的使用方来说,就可以根据这些“生命周期的时机的通知”来实现自己的各种各样的业务逻辑

AFNetworking

Demo2

本demo是请求https://www.baidu.com,然后打印响应的数据。

  1. demo代码如下:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json", @"text/json" ,@"text/javascript", nil];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:@"https://www.baidu.com" parameters:nil headers:nil progress:^(NSProgress * _Nonnull downloadProgress) {
    NSLog(@"csx,fractionCompleted=%lf", downloadProgress.fractionCompleted);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"csx,response=%@", responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"csx,error=%@", error);
}];
  1. 运行代码,得到的请求结果如下图。
    在这里插入图片描述

AFNetworking和系统网络库的类关系图

建议先看看https://www.jianshu.com/p/486b1b19cc6d文章里面的请求处理流程,然后再往下看。
根据上面demo用到的网络相关的类及其关联的类,我们便可以梳理出如下类图:
在这里插入图片描述
我们再结合本demo所使用的类来看看这些类所提供的功能。如下图,我们使用AFHTTPSessionManager的GET方法来发起“请求”,使用AFHTTPResponseSerializer来解析服务端返回的数据。
在这里插入图片描述
从本demo中,我们可以总结出:

  • AFNetworking框架提供了多个将请求参数序列化的功能类,比如AFHTTPRequestSerializer类,该类针对GET请求方式的请求, 会把请求参数以键值对的方式拼接到请求url中。框架的使用方可以根据需要来选择合适的序列化功能类,如果这些功能类都不满足,那么使用方可以通过实现AFURLRequestSerialization协议来自定义自己的序列化方式
  • AFNetworking框架提供了多个将响应数据按某种格式解析的功能类,比如AFHTTPResponseSerializer类,该类会按照http协议的标准解析出响应数据中的响应头、响应体的数据。框架的使用方可以根据需要来选择合适的序列化功能类,如果这些功能类都不满足,那么使用方可以通过实现AFURLResponseSerialization协议来自定义自己的序列化方式
  • AFNetworking框架基于NSURLSession封装了‘使用NSURLSession发起请求和响应请求时的常用操作步骤’。比如,如果我们使用NSURLSession来请求某个网址,那么我们会先初始化NSURLSession,然后用该NSURLSession来获取一个NSURLSessionDataTask实例对象,接着调用NSURLSessionDataTask实例对象的resume方法,然后通过NSURLSession的delegate来获取响应数据,然后解析响应数据,最后再处理解析后的数据(具体代码请看前面的Demo1)。而如果我们使用AFNetworking来请求某个网址的话,那么我们只需要调用初始化AFHTTPSessionManager,然后调用该类的
    GET:parameters:headers:progress:success:failure:方法即可获取到解析后的响应数据,然后就可以根据业务需要来处理解析后的数据了

我们再来看看AFURLSessionManager类的.h文件,如下图,发现该类暴露了很多系统自带的网络相关的类,比如NSURLSession、NSURLSessionDataTask、NSURLSessionConfiguration,也就是说,对于配置请求超时时间等ios系统自带的网络配置等,AFNetworking会直接暴露出来让框架的使用方来配置,而不是将这些配置封装起来
在这里插入图片描述
所以,AFNetworking库带来的好处是降低了网络请求的开发成本,具体体现在:

  • AFNetworking把NSURLSession的常规使用步骤封装成GET、POST等多个方法,框架使用方只需要调用某个方法即可完成请求的发起和响应数据的解析;
  • AFNetworking内部实现了很多通用且常用的序列化工具类,比如AFHTTPResponseSerializer、AFHTTPRequestSerializer、AFJSONResponseSerializer,框架使用方可以直接使用这些序列化工具类来完成数据的解析。如果这些工具类都不满足框架使用方的诉求,那么框架使用方可以通过实现AFURLRequestSerialization或者AFURLResponseSerialization协议来自定义自己的解析逻辑。

所以,对于一些通用且常用的处理逻辑代码,我们直接以工具类的方式来设计

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

41、web基础和http协议

web基础与http协议 一、web web&#xff1a;就是我们所说得页面&#xff0c;打开网页展示得页面。&#xff08;全球广域网&#xff0c;万维网&#xff09; world wide webwww 分布式图形信息系统 http&#xff1a;超文本传输协议 https&#xff1a;加密的超文本传输协议…

上位机图像处理和嵌入式模块部署(mcu 项目1:固件编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 说完了上位机的开发&#xff0c;接下来就是固件的开发。前面我们说过&#xff0c;目前使用的开发板是极海apm32f103的开发板。它自身包含了iap示例…

人工智能--目标检测

欢迎来到 Papicatch的博客 文章目录 &#x1f349;引言 &#x1f349;概述 &#x1f348;目标检测的主要流程通常包括以下几个步骤 &#x1f34d;数据采集 &#x1f34d;数据预处理 &#x1f34d;特征提取 &#x1f34d;目标定位 &#x1f34d;目标分类 &#x1f348;…

千益畅行,旅游卡,如何赚钱?

​ 赚钱这件事情&#xff0c;只有自己努力执行才会有结果。生活中没有幸运二字&#xff0c;每个光鲜亮丽的背后&#xff0c;都是不为人知的付出&#xff01; #旅游卡服务#

【分布式数据仓库Hive】Hive的安装配置及测试

目录 一、数据库MySQL安装 1. 检查操作系统是否有MySQL安装残留 2. 删除残留的MySQL安装&#xff08;使用yum&#xff09; 3. 安装MySQL依赖包、客户端和服务器 4. MySQL登录账户root设置密码&#xff0c;密码值自定义&#xff0c;这里是‘abc1234’ 5. 启动MySQL服务 6…

element plus 日期组件中英文切换

现在的项目需要做中英文切换功能&#xff0c;我发现element plus 只有日期组件不能转换&#xff0c;然后上网查了一下并结合自己的方法写了出来。 代码&#xff1a; <template><!-- 日期框组件 --><div class"time-box">//:locale"locale&qu…

嵌入式UI开发-lvgl+wsl2+vscode系列:5、事件(Events)

一、前言 这节进行事件的总结&#xff0c;通过事件回调方式将用户和ui的交互行为绑定组合起来。 二、事件示例 1、示例1&#xff08;点击事件&#xff09; #include "../lv_examples.h" #if LV_BUILD_EXAMPLES && LV_USE_SWITCHstatic void event_cb(lv_…

解锁机器学习算法面试挑战课程

在这个课程中&#xff0c;我们将从基础知识出发&#xff0c;系统学习机器学习与算法的核心概念和实践技巧。通过大量案例分析和LeetCode算法题解&#xff0c;帮助您深入理解各种面试问题&#xff0c;并掌握解题技巧和面试技巧。无论是百面挑战还是LeetCode算法题&#xff0c;都…

华为智能驾驶方案剖析

华为ADS智驾方案始终坚持激光雷达毫米波雷达摄像头的多传感器融合路线&#xff0c;行业降本压力下硬件配置从超配逐步转向贴合实际需求&#xff0c;带动整体硬件成本下降。 1)单车传感器数量呈现下降趋势&#xff0c;包括激光雷达从3个减配至1个、毫米波雷达从6R减配至3R、摄像…

firewalld防火墙概念(形态、分类、区域)相关综合示例

目录 防火墙 概念 形态 内核态&#xff1a;netfilter 用户态&#xff1a;iptables、firewalld 防火墙分类 firewalld网络区域 区域划分 使用图形化界面配置防火墙 端口配置 协议配置 源端口配置 永久配置恢复默认防火墙规则 配置防火墙相关命令 示例 实验环境 …

谷粒商城篇章10 -- P262-P291/P295-P310 -- 订单服务(支付)【分布式高级篇七】

目录 1 页面环境搭建 1.1 静态资源上传到nginx 1.2 SwitchHosts增加配置 1.3 网关配置 1.4 订单模块基础配置 1.4.1 引入 thymeleaf 依赖 1.4.2 application.yml配置 1.4.3 bootstrap.properties配置 1.4.4 开启nacos注册发现和远程调用 1.5 修改各个页面的静态资源路…

Hadoop权威指南-读书笔记-01-初识Hadoop

Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 第一章—初识Hadoop Tips&#xff1a; 这个引例很有哲理嘻嘻&#x1f604;&#xff0c;道出了分布式的灵魂。 1.1 数据&#xff01;数据&#xff01; 这一小节主要介绍了进入大数据时代&#xff0c;面…

使用简鹿音频格式转换器轻松将MP3转换为WAV音频

在音频处理领域&#xff0c;不同的格式有其特定的应用场景。有时&#xff0c;我们可能需要将MP3格式的音频转换为WAV格式&#xff0c;以满足特定的播放或编辑需求。简鹿音频格式转换器就是一款能够帮助我们轻松实现这一转换目标的工具。 为什么选择 WAV 格式&#xff1f; WAV …

CentOS中使用SSH远程登录

CentOS中使用SSH远程登录 准备工作SSH概述SSH服务的安装与启动建立SSH连接SSH配置文件修改SSH默认端口SSH文件传输 准备工作 两台安装CentOS系统的虚拟机 客户机&#xff08;192.168.239.128&#xff09; 服务器&#xff08;192.168.239.129&#xff09; SSH概述 Secure S…

【RabbitMQ实战】Springboot 整合RabbitMQ组件,多种编码示例,带你实践 看完这一篇就够了

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、对RabbitMQ管理界面深入了解1、在这个界面里面我们可以做些什么&#xff1f; 二、编码练习&#xff08;1&#xff09;使用direct exchange(直连型交换机)&a…

【深圳大学算法设计与分析】 实验六 最大流应用问题 FF -> EK -> Dinic

目录 一、实验目的&#xff1a; 二、内容&#xff1a;棒球赛问题 三、实验要求 四、提交要求 ———————— 问题分析解释&#xff1a; ———————— 算法简解&#xff1a; Ford–Fulkerson 增广 Edmonds–Karp 算法 Dinic算法 Dinic和EK的区别&#xff1a; …

DDPM(Denoising Diffusion Probabilistic Models)

DDPM&#xff08;Denoising Diffusion Probabilistic Models&#xff09; 笔记来源&#xff1a; 1.Denoising Diffusion Probabilistic Models 2.大白话AI | 图像生成模型DDPM | 扩散模型 | 生成模型 | 概率扩散去噪生成模型 3.pytorch-stable-diffusion 扩散模型正向过程&am…

Kafka-服务端-网络层-源码流程

整体架构如下所示&#xff1a; responseQueue不在RequestChannel中&#xff0c;在Processor中&#xff0c;每个Processor内部有一个responseQueue 客户端发送的请求被Acceptor转发给Processor处理处理器将请求放到RequestChannel的requestQueue中KafkaRequestHandler取出reque…

易校网校园综合跑腿小程序源码修复运营版

简介&#xff1a; 易校网校园综合跑腿小程序源码修复运营版&#xff0c;带服务端客户端前端文档说明。 源码安装方法&#xff1a; 需要准备小程序服务号 服务器 备案域名 校园网跑腿小程序源码需要准备 1.小程序 2.服务器&#xff08;推荐配置2h4g3m&#xff09; 3.域名…

安卓实现微信聊天气泡

一搜没一个能用的&#xff0c;我来&#xff1a; 布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xml…