【AICon】 如何构建高效的 RAG 系统?RAG 技术在实际应用中遇到的挑战及应对策略?>>> 了解详情
写点什么

AFNetworking 概述(一)

  • 2019-12-10
  • 本文字数:3163 字

    阅读完需:约 10 分钟

AFNetworking 概述(一)

在这一系列的文章中,我会对 AFNetworking 的源代码进行分析,深入了解一下它是如何构建的,如何在日常中完成发送 HTTP 请求、构建网络层这一任务。


AFNetworking 是如今 iOS 开发中不可缺少的组件之一。它的 github 配置上是如下介绍的:


Perhaps the most important feature of all, however, is the amazing community of developers who use and contribute to AFNetworking every day. AFNetworking powers some of the most popular and critically-acclaimed apps on the iPhone, iPad, and Mac.


可以说使用 AFNetworking 的工程师构成的社区才使得它变得非常重要。

概述

我们今天是来深入研究一下这个与我们日常开发密切相关的框架是如何实现的。


这是我对 AFNetworking 整个架构的理解,随后一系列的文章也会逐步分析这些模块。



在这篇文章中,我们有两个问题需要了解:


  1. 如何使用 NSURLSession 发出 HTTP 请求

  2. 如何使用 AFNetworking 发出 HTTP 请求

NSURLSession

NSURLSession 以及与它相关的类为我们提供了下载内容的 API,这个 API 提供了一系列的代理方法来支持身份认证,并且支持后台下载。


使用 NSURLSession 来进行 HTTP 请求并且获得数据总共有五个步骤:


  1. 实例化一个 NSURLRequest/NSMutableURLRequest,设置 URL

  2. 通过 - sharedSession 方法获取 NSURLSession

  3. 在 session 上调用 - dataTaskWithRequest:completionHandler: 方法返回一个 NSURLSessionDataTask

  4. 向 data task 发送消息 - resume,开始执行这个任务

  5. 在 completionHandler 中将数据编码,返回字符串


Objective-C


NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"https://github.com"]];NSURLSession *session = [NSURLSession sharedSession];NSURLSessionDataTask *task = [session dataTaskWithRequest:request                                       completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {                                           NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];                                           NSLog(@"%@", dataStr);                                       }];[task resume];
复制代码


这一段代码可以说是使用 NSURLSession 发送请求最简单的一段代码了,当你运行这段代码会在控制台看到一坨 github 首页的 html。


<!DOCTYPE html><html lang="en" class="">  <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# object: http://ogp.me/ns/object# article: http://ogp.me/ns/article# profile: http://ogp.me/ns/profile#">    <meta charset='utf-8'>    ...  </head>  ...</html>
复制代码

AFNetworking

AFNetworking 的使用也是比较简单的,使用它来发出 HTTP 请求有两个步骤


  1. 以服务器的主机地址或者域名生成一个 AFHTTPSessionManager 的实例

  2. 调用 - GET:parameters:progress:success:failure: 方法


Objective-C


AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[[NSURL alloc] initWithString:@"hostname"]];[manager GET:@"relative_url" parameters:nil progress:nil    success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        NSLog(@"%@" ,responseObject);    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {        NSLog(@"%@", error);    }];
复制代码


注意:在 iOS9 中,苹果默认全局 HTTPs,如果你要发送不安全的 HTTP 请求,需要在 info.plist 中加入如下键值对才能发出不安全的 HTTP 请求

还有一件事情是要注意的是,AFNetworking 默认接收 json 格式的响应(因为这是在 iOS 平台上的框架,一般不需要 text/html),如果想要返回 html,需要设置 acceptableContentTypes

AFNetworking 的调用栈

在这一节中我们要分析一下在上面两个方法的调用栈,首先来看的是 AFHTTPSessionManager 的初始化方法 - initWithBaseURL:


Objective-C


- [AFHTTPSessionManager initWithBaseURL:]  - [AFHTTPSessionManager initWithBaseURL:sessionConfiguration:]    - [AFURLSessionManager initWithSessionConfiguration:]      - [NSURLSession sessionWithConfiguration:delegate:delegateQueue:]      - [AFJSONResponseSerializer serializer] // 负责序列化响应      - [AFSecurityPolicy defaultPolicy] // 负责身份认证      - [AFNetworkReachabilityManager sharedManager] // 查看网络连接情况    - [AFHTTPRequestSerializer serializer] // 负责序列化请求    - [AFJSONResponseSerializer serializer] // 负责序列化响应
复制代码


从这个初始化方法的调用栈,我们可以非常清晰地了解这个框架的结构:


  • 其中 AFURLSessionManagerAFHTTPSessionManager 的父类

  • AFURLSessionManager 负责生成 NSURLSession 的实例,管理 AFSecurityPolicyAFNetworkReachabilityManager,来保证请求的安全和查看网络连接情况,它有一个 AFJSONResponseSerializer 的实例来序列化 HTTP 响应

  • AFHTTPSessionManager 有着自己的 AFHTTPRequestSerializerAFJSONResponseSerializer 来管理请求和响应的序列化,同时依赖父类提供的接口保证安全、监控网络状态,实现发出 HTTP 请求这一核心功能


初始化方法很好地揭示了 AFNetworking 整个框架的架构,接下来我们要通过分析另一个方法 - GET:parameters:process:success:failure: 的调用栈,看一下 HTTP 请求是如何发出的:


Objective-C


- [AFHTTPSessionManager GET:parameters:process:success:failure:]  - [AFHTTPSessionManager dataTaskWithHTTPMethod:parameters:uploadProgress:downloadProgress:success:failure:] // 返回 NSURLSessionDataTask #1    - [AFHTTPRequestSerializer requestWithMethod:URLString:parameters:error:] // 返回 NSMutableURLRequest    - [AFURLSessionManager dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:] // 返回 NSURLSessionDataTask #2      - [NSURLSession dataTaskWithRequest:] // 返回 NSURLSessionDataTask #3      - [AFURLSessionManager addDelegateForDataTask:uploadProgress:downloadProgress:completionHandler:]        - [AFURLSessionManagerTaskDelegate init]        - [AFURLSessionManager setDelegate:forTask:]  - [NSURLSessionDataTask resume]
复制代码


在这里 #1 #2 #3 处返回的是同一个 data task,我们可以看到,在 #3 处调用的方法 - [NSURLSession dataTaskWithRequest:] 和只使用 NSURLSession 发出 HTTP 请求时调用的方法 - [NSURLSession dataTaskWithRequest:completionHandler:] 差不多。在这个地方返回 data task 之后,我们再调用 - resume 方法执行请求,并在某些事件执行时通知代理 AFURLSessionManagerTaskDelegate

小结

AFNetworking 实际上只是对 NSURLSession 高度地封装, 提供一些简单易用的 API 方便我们在 iOS 开发中发出网络请求并在其上更快地构建网络层组件并提供合理的接口.


到这里,这一篇文章从上到下对 AFNetworking 是如何调用的进行了一个简单的概述,我会在随后的文章中会具体介绍 AFNetworking 中的每一个模块,了解它们是如何工作,并且如何合理地组织到一起的。


关于其他 AFNetworking 源代码分析的其他文章:



本文转载自 Draveness 技术博客。


原文链接:https://draveness.me/afnetworking1


2019-12-10 17:53684

评论

发布
暂无评论
发现更多内容

【软件推荐】TOP级YouTube视频下载工具2021

科技猫

软件 分享 工具软件 视频 youtube

嘿,朋友!和你讲讲这15年来我的成长吧

亚马逊云科技 (Amazon Web Services)

【LeetCode】寻找旋转排序数组中的最小值 IIJava题解

Albert

算法 LeetCode 4月日更

聪明人的训练(九)

Changing Lin

4月日更

新华三“云屏”发布:云屏融合重塑工作体验,全力构建智“会”时代

DT极客

Fl Studio真的不如Cubase或者Logic Pro等电音软件专业吗?

奈奈的杂社

编曲 电音 电音制作 中国电音 编曲宿主

Android音视频 - MediaCodec编解码音视频

LoveYFan

android 音视频 编解码

在业务高峰期拔掉服务器电源是一种怎样的体验?

冰河

分布式 微服务 数据恢复 MySQL 高可用 异常处理

一位五年Java开发经验程序员的拼多多/蚂蚁金服/百度面经分享!

Java架构之路

Java 程序员 架构 面试 编程语言

Android音视频 - EGL源码解析以及C++实现

LoveYFan

android 音视频 OpenGL ES

深入浅出 LVS 负载均衡系列(一):NAT、FULLNAT 模型原理

UCloud技术

负载均衡

你真的懂反馈吗?

石云升

28天写作 职场经验 管理经验 4月日更

19张图带你梳理SpringCloud体系中的重要技术点!

Java架构师迁哥

平面设计之PS(中)

空城机

PhotoShop ps 4月日更

CIAM的7个基本原则

龙归科技

安全性 用户 业务增长

三翼鸟的羽翼下,人诗意地栖居在智能生活里

脑极体

游戏数据埋点

data_y

游戏 数据埋点 游戏数据分析 埋点定义

一份秀出新天际的SpringCloudAlibaba笔记,把微服务玩的出神入化

Java 编程 程序员 架构 微服务

你可能不是真的懂let和const

前端树洞

JavaScript ecmascript 大前端 ES6 4月日更

这里有一份2021年Java面试必备的《并发编程》学习资料,你要还是不要?

Java架构之路

Java 程序员 架构 面试 编程语言

AI 事件驱动场景 Serverless 实践

阿里巴巴云原生

人工智能 Serverless 容器 云原生 消息中间件

一个DNS引发的“血案”

穿过生命散发芬芳

Wireshark 数据包分析 4月日更

一周信创舆情观察(3.29~4.4)

统小信uos

Github限时开放!阿里内部强推的《微服务容器化参考指南》简直太牛了!

Java架构之路

Java 程序员 架构 面试 编程语言

调整云计算资源大小时要避免的10个错误

浪潮云

云计算

我的 2015-2018 —— 银行软开三年项目回顾

清秋

大前端 重构 鉴权 4月日更

全面提升鸡群产能!Newcher智慧养鸡场解决方案剖析

Rancher

新的物联网技术应用有哪些

cdhqyj

互联网 物联网 通信 计算机

【得物技术】算法入门一:算法的好坏?复杂度告诉你

得物技术

算法 时间复杂度 大前端 入门 复杂度

经典递归

山@支

JavaScript小笔记

赫鲁小夫

4月日更

AFNetworking 概述(一)_语言 & 开发_Draveness_InfoQ精选文章