【iOS】使用AFNetworking进行网络请求
文章目录
- 前言
- AFNetworking
- AFNetworking 的核心组件
- AKNetworking库的常用方法
- 使用AKNetworking进行网络请求的步骤和代码示例
- 总结
前言
在暑假写天气预报项目时,我们已经接触到网络请求,当时我们是使用URLSession类,即Foundation框架中用于管理和配置网络连接的API,来完成对实时天气预报数据的请求,现在我们来学习一种更方便的网络请求方式——使用一个单例通过AFNetworking来实现网络请求。
AFNetworking
AFNetworking 是一个开源的网络库,它基于 NSURLSession,为 iOS、macOS、watchOS 和 tvOS 应用程序开发提供了强大的网络请求功能。AFNetworking 通过简单的 API 设计,使得开发者可以轻松地处理 HTTP 请求,包括 GET、POST、PUT、DELETE 等操作。它还支持文件上传、下载、自动处理 HTTP 缓存、自定义缓存策略、安全性设置等高级特性。
由此来看,AKNetworking库兼容了我们之前使用URLSession类来进行网络请求的方法。使用这个库可以简化我们进行网络请求的代码,在使用前记得下载cocoapods然后将该库安装到对应的文档里。
AFNetworking 的核心组件
AFHTTPSessionManager:这是最常用的类,用于处理 HTTP 请求。它基于 NSURLSession,可以发送网络请求和处理响应。
AFURLSessionManager:同样基于 NSURLSession,用于管理下载、上传等任务。
AFNetworkReachabilityManager:用于监控网络状态的变化,帮助开发者了解当前的网络连接情况。
序列化和反序列化:AFNetworking 自动解析响应的数据格式,如 JSON、XML、图片等,并且支持自定义序列化和反序列化操作。
AKNetworking库的常用方法
-
AFHTTPSessionManager:这是最常用的类,用于处理 HTTP 请求。它基于
NSURLSession
,可以发送网络请求和处理响应。 -
GET 请求:使用
GET
方法发送请求,可以传递参数字典,并且在请求成功或失败时提供回调。AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSDictionary *parameters = @{@"key": @"value"}; [manager GET:@"http://example.com/api" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {NSLog(@"Success: %@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) {NSLog(@"Error: %@", error); }];
-
POST 请求:使用
POST
方法发送请求,同样可以传递参数字典,并在请求成功或失败时提供回调。[manager POST:@"http://example.com/api" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {NSLog(@"Success: %@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) {NSLog(@"Error: %@", error); }];
-
文件上传:AFNetworking 支持文件上传,并且可以监控上传进度。
NSURL *fileURL = [NSURL fileURLWithPath:@"path/to/file"]; [manager POST:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {[formData appendPartWithFileURL:fileURL name:@"file" fileName:@"filename" mimeType:@"file mimeType"]; } progress:^(NSProgress *uploadProgress) {NSLog(@"Upload Progress: %@%", uploadProgress.fractionCompleted); } success:^(NSURLSessionDataTask *task, id responseObject) {NSLog(@"Success: %@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) {NSLog(@"Error: %@", error); }];
-
文件下载:AFNetworking 也支持文件下载,并且可以指定下载进度和完成时的回调。
NSURL *fileURL = [NSURL URLWithString:@"http://example.com/file"]; NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:[NSURLRequest requestWithURL:fileURL] progress:^(NSProgress *downloadProgress) {NSLog(@"Download Progress: %@%", downloadProgress.fractionCompleted); } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {return [NSURL fileURLWithPath:@"path/to/save/file"]; } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {if (error) {NSLog(@"Download Error: %@", error);} else {NSLog(@"Download Success: %@", filePath);} }]; [downloadTask resume];
-
网络状态监控:使用
AFNetworkReachabilityManager
可以监控网络状态的变化。AFNetworkReachabilityManager *reachabilityManager = [AFNetworkReachabilityManager sharedManager]; [reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {switch (status) {case AFNetworkReachabilityStatusReachableViaWiFi:NSLog(@"Reachable via WiFi");break;case AFNetworkReachabilityStatusReachableViaWWAN:NSLog(@"Reachable via WWAN");break;case AFNetworkReachabilityStatusNotReachable:NSLog(@"Not reachable");break;} }]; [reachabilityManager startMonitoring];
-
响应序列化:AFNetworking 提供了多种响应序列化器,如
AFJSONResponseSerializer
,AFXMLParserResponseSerializer
等,用于自动解析服务器返回的数据。 -
单例模式:在实际应用中,通常会将 AFNetworking 封装在单例类中,以便在整个应用中统一管理和使用网络请求。
-
缓存机制:AFNetworking 支持内存缓存和磁盘缓存,可以配置缓存策略来提高应用性能和用户体验 。
-
HTTPS 和 SSL/TLS 支持:AFNetworking 支持 HTTPS 请求,并且可以配置 SSL/TLS 证书,以确保数据传输的安全性 。
-
响应式布局和动态请求:可以根据不同的设备和屏幕尺寸动态调整请求参数,以适应不同的设备和屏幕尺寸 。
-
复合响应序列化:
AFCompoundResponseSerializer
允许同时使用多个响应序列化器,这在处理复杂或混合格式的响应时非常有用。 -
图片加载和处理:
AFImageResponseSerializer
不仅可以处理图片的下载,还可以进行图片的解压和缓存,以提高图片显示的性能 。 -
错误处理和重试机制:AFNetworking 提供了丰富的错误处理机制,你可以设置重试策略,以应对网络不稳定或服务器错误的情况。
使用AKNetworking进行网络请求的步骤和代码示例
引入 AFNetworking:通过 CocoaPods 或其他依赖管理工具将 AFNetworking 添加到项目中。
创建 AFHTTPSessionManager 实例:这个实例将用于发起网络请求。
配置请求和响应序列化器:AFNetworking 提供了多种序列化器,如 AFJSONRequestSerializer 和 AFJSONResponseSerializer,用于处理 JSON 格式的数据。
发起网络请求:使用 GET、POST 等方法发起网络请求,并在回调中处理响应数据。
处理响应和错误:在回调中,你可以获取到响应数据,并根据需要进行处理。
// 创建 AFHTTPSessionManager 实例
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];// 设置请求和响应序列化器
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];// 发起 GET 请求
[manager GET:@"https://example.com/api/resource" parameters:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {// 请求成功的回调NSLog(@"Response: %@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {// 请求失败的回调NSLog(@"Error: %@", error);
}];
总结
AFNetworking 作为一个开源库,简化了网络请求的过程,相比于之前使用xcode自带的URLSession类来进行网络请求便利许多,在后续写项目的过程中有时应该会更加明显。
相关文章:
【iOS】使用AFNetworking进行网络请求
文章目录 前言AFNetworkingAFNetworking 的核心组件AKNetworking库的常用方法使用AKNetworking进行网络请求的步骤和代码示例 总结 前言 在暑假写天气预报项目时,我们已经接触到网络请求,当时我们是使用URLSession类,即Foundation框架中用于管…...

ThingsBoard规则链节点:RPC Call Reply节点详解
引言 1. RPC Call Reply 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 设备控制 3.2 状态查询 3.3 命令执行 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台,提供了设备管理…...

【AI换装整合包及教程】OOTDiffusion:以AI技术引领的时尚换装革命
在当今数字化快速发展的时代,人工智能(AI)技术正以前所未有的速度改变着我们的生活。从智能家居到自动驾驶,从在线教育到虚拟现实,AI的应用范围正在不断扩展。而在时尚领域,一款名为OOTDiffusion࿰…...
排序算法详细总结
算法 定义:算法是解决特定问题的明确步骤集合。算法的效率通常用时间复杂度和空间复杂度来衡量。 排序算法 定义:排序算法是计算机科学中用于对元素序列进行排序的一系列算法。排序算法在各种应用中都非常常见,从简单的数据处理到复杂的数…...
uniapp MD5加密
安装: npm install js-md5 -D 引入: import Md5 from js-md5 需求加密一个对象, login_form: {openId: 123456789,phone: ,scenario: 656677,phoneSessionKey: ,openIdSessionKey: ,timeStamp: , }, //10位时间戳(秒)…...

提升视觉回归测试体验:Cypress 插件推荐
项目介绍 在现代前端开发中,视觉回归测试是确保用户界面在不同版本之间保持一致性的关键步骤。然而,传统的视觉回归测试工具往往复杂且难以使用。为了解决这一问题,我们推荐一款专为 Cypress 设计的插件:Cypress Plugin Visual Re…...

fastbootd模式刷android固件的方法
1. fastbootd追根溯源 Google在Android 10上正式引入了动态分区机制来提升OTA的可扩展性。动态分区使能后:andorid系统可以在开机阶段动态地进行分区创建、分区销毁、分区大小调整等操作,下游厂商只需要规划好super分区的总大小,其内部的各个…...

基于C#实现Windows后台窗口操作与图像处理技术分析
在Windows编程中,操作后台窗口是一项复杂而有用的技术。它可以用来自动化用户界面测试、应用程序机器人等场景。本文将深入探讨如何在C#中绑定后台窗口、获取后台窗口界面图片,以及在图片中寻找指定图标并获取坐标。本技术文章结合最先进的资料与实践经验…...

戴尔电脑 Bios 如何进入?Dell Bios 进入 Bios 快捷键是什么?
BIOS(基本输入输出系统)是计算机启动时运行的第一个程序,它负责初始化硬件并加载操作系统。对于戴尔电脑用户来说,有时可能需要进入 BIOS 进行一些特定的设置调整,比如更改启动顺序、调整性能选项或解决硬件兼容性问题…...

数据结构之二叉树——堆 详解(含代码实现)
1.堆 如果有一个关键码的集合 K { , , , … ,},把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,则称为小堆( 或大堆 ) 。将根节点最大的堆叫做最大堆或大根堆,根节点最小的…...

推荐一款面向增材制造的高效设计平台:nTopology
nTopology是一款面向增材制造的高效设计平台,平台预置了大量增材制造常用的设计工具包,工程师通过调用若干个预置工具包、或自主开发定制的工具包,建立一个工作流,实现复杂几何结构的参数化设计。nTopology集合了的强大几何建模和…...

SQL,力扣题目1767,寻找没有被执行的任务对【递归】
一、力扣链接 LeetCode_1767 二、题目描述 表:Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…...
JavaScript数据类型- Symbol 详解
文章目录 前言1.唯一性2. 描述3. 作为对象属性键4. 全局注册6. 不可变性7. 隐式转换 前言 Symbol是ES6新增内容,代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题 在JavaScript发展的过程中,其中的ES6带…...

WordPress网站添加嵌入B站视频,自适应屏幕大小,取消自动播放
结合bv号 改成以下嵌入式代码(自适应屏幕大小,取消自动播放) <iframe style"width: 100%; aspect-ratio: 16/9;" src"//player.bilibili.com/player.html?isOutsidetrue&bvidBV13CSVYREpr&p1&autoplay0" scrolling…...

11.6 校内模拟赛总结
打的很顺的一场 复盘 7:40 开题,看到题目名很interesting T1 看起来很典,中位数显然考虑二分,然后就是最大子段和;T2 构造?一看数据范围这么小,感觉不是很难做;T3 神秘数据结构;T…...
Redis常用的五大数据类型(列表List,集合set)
简介 List 的特点:单键多值。底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。 Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边ÿ…...

Ubuntu 20.04 部署向量数据库 Milvus + Attu
前言 最开始在自己的办公电脑(无显卡的 windows 10 系统) 上使用 Docker Desktop 部署了 Milvus 容器,方便的很, 下载 Attu 也很方便,直接就把这个向量数据库通过 Attu 这个图形化界面跑了起来,使用起来感…...

实现数传数据转网口(以太网)和遥控器SBUS信号转串口的功能
为了帮助你实现数传数据转网口(以太网)和SBUS信号转串口的功能,这里提供一个基本的框架。我们将使用STM32微控制器来完成这些任务。假设你已经具备了STM32的基本开发经验,并且已经安装了相应的开发环境(如STM32CubeIDE…...

APP 后台广告位配置的关键要素与策略
在当今数字化营销的浪潮中,APP 作为重要的信息传播渠道,其后台广告位的配置显得尤为关键。这不仅影响着广告的展示效果,还直接关系到用户体验和平台收益。 首先,了解目标受众是配置广告位的基础。通过对 APP 用户的行为数据进行分…...
分布式数据库概述
分布式数据库概述 分布式数据库是一种将数据分散存储在多个物理节点上的数据库系统,这些节点通过网络相互连接,形成一个逻辑上统一的数据库系统。它旨在提高数据的可用性、可靠性、性能和可扩展性,是现代大数据和云计算环境下不可或缺的重要技术。 一、分布式数据库的核心…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...