AFNetworking 概述(一)

本文深入介绍了AFNetworking的使用方法及其实现原理。首先讲解了如何使用NSURLSession发起HTTP请求,然后对比了AFNetworking的使用方式,并详细分析了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-plist

还有一件事情是要注意的是,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] // 负责序列化响应

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

  • 其中 AFURLSessionManager 是 AFHTTPSessionManager 的父类
  • AFURLSessionManager 负责生成 NSURLSession 的实例,管理 AFSecurityPolicy 和 AFNetworkReachabilityManager,来保证请求的安全和查看网络连接情况,它有一个 AFJSONResponseSerializer的实例来序列化 HTTP 响应
  • AFHTTPSessionManager 有着自己的 AFHTTPRequestSerializer 和 AFJSONResponseSerializer 来管理请求和响应的序列化,同时依赖父类提供的接口保证安全、监控网络状态,实现发出 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 源代码分析的其他文章:

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值