【iOS】使用AFNetworking更方便实现网络请求

目录

前言

如何使用AFNetworing实现网络请求

使用单例

进行网络申请

结语


前言

OC中原生的网络请求流程非常麻烦,通常是以下流程:

  1. 创建NSURL对象确定请求地址。
  2. 使用NSURL创建NSURLRequest对象,可设置请求方法、请求头等。
  3. 创建NSURLSession对象,通常使用共享会话。
  4. 使用NSURLSession创建数据任务NSURLSessionDataTask,传入请求对象和回调方法。
  5. 启动数据任务,调用resume方法。
  6. 在回调方法中处理响应数据或错误情况。
  7. (可选)可在需要时取消请求,调用数据任务的cancel方法。

笔者之前在天气预报项目中使用时,也只是知道了使用的方法依葫芦画瓢,并且申请流程非常繁琐,现在如果使用AFNetworking第三方库来实现网络请求,就会变得简便许多。

如何使用AFNetworing实现网络请求

使用AFNetworking实现网络请求大致流程如下:

  1. 创建 AFHTTPSessionManager 对象作为请求管理者。
  2. 确定请求的 URL,创建 NSURL 对象。
  3. 对于 GET 请求:
    • 准备请求参数,创建 NSDictionary 对象。
    • 使用 GET 方法发起请求,传入 URL、参数、成功回调和失败回调。
  4. 对于 POST 请求:
    • 准备请求参数和请求体数据。
    • 使用 POST 方法发起请求,传入 URL、参数、成功回调和失败回调。
  5. 在成功回调中处理响应数据。
  6. 在失败回调中处理请求错误。
  7. (可选)如果需要取消请求,可对请求管理者的任务集合进行取消操作。

下面以GET为例演示一下具体流程

使用单例

首先,我们在实现网络请求时,应使用单例来统一实现,这样做的好处是,可以避免在不同的页面反复创建对象申请网络请求,同时也更有利于维护

所以实现网络请求的第一步,便是创建一个单例,关于创建单例的知识,笔者之前已有博客详细讲述,这里就不多赘述了,这里附上链接:

进行网络申请

我们在进行网络请求时,将JSON数据直接转换成Model,方便我们实现MVC的结构

//在.h文件中,定义给block命名:typedef void(^successBlock)(testModel* testModel);
- (void) NetWorkWithData {AFHTTPSessionManager* manger = [AFHTTPSessionManager manager];NSString* str = @"https://news-at.zhihu.com/api/4/version/ios/2.3.0";[manger GET:str parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {testModel* model = [testModel yy_modelWithJSON:responseObject];} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"error");}];
}

这样就实现了网络请求并将数据转换成了Model,而原生的请求流程如下:

void dataload {NSString* urlString = @"https://devapi.qweather.com/v7/weather/3d?location=101010100&key=34e1f7a3ef5544d393fcafaea08f0f1b";NSURL* url = [NSURL URLWithString:urlString];NSURLRequest *request = [NSURLRequest requestWithURL:url];NSURLSession *session = [NSURLSession sharedSession];NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (!error && data) {NSError *jsonError;NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];if (!jsonError && [jsonDict isKindOfClass:[NSDictionary class]]) {AModel *model = [AModel yy_modelWithDictionary:jsonDict];NSLog(@"%@",model);}} else {NSLog(@"Error: %@", error);}}];[task resume];
}

显而易见,使用AFNetworking大大减小了代码量,更便于阅读和编写。

这里有关GET方法的几个参数如下:

URL 参数

 
  • 类型:NSURL 或者其字符串表示形式。
  • 描述:这是要请求的网络资源的地址。它指定了请求的目标位置,例如 https://example.com/api/data。
 

parameters 参数

 
  • 类型:NSDictionary。
  • 描述:这是一个字典,用于传递请求的参数。在 GET 请求中,这些参数通常会被附加到 URL 的查询字符串中。例如,如果参数字典为 @{@"param1": @"value1", @"param2": @"value2"},并且 URL 是 https://example.com/api/data,那么最终的请求 URL 可能会变成 https://example.com/api/data?param1=value1&param2=value2。
 

progress 参数

 
  • 类型:通常是一个 void (^)(NSProgress *downloadProgress) 类型的块。
  • 描述:这个参数用于跟踪下载进度。它接收一个 NSProgress 对象,该对象包含了已下载的数据量、总数据量等信息。可以在这个块中实现进度条更新等操作。如果不需要跟踪进度,可以传入 nil。
 

headers 参数

 
  • 类型:NSDictionary。
  • 描述:用于设置 HTTP 请求头部信息。例如,可以设置Authorization进行身份验证,设置User-Agent表明客户端类型等。通过设置不同的头部,可以控制服务器对请求的处理方式。
 

success 参数

 
  • 类型:void (^)(NSURLSessionDataTask *task, id responseObject) 类型的块。
  • 描述:这是请求成功后的回调块。当请求成功时,这个块会被调用。NSURLSessionDataTask 参数是表示当前请求任务的对象,可以用于取消请求等操作。responseObject 参数是服务器返回的响应数据,通常是一个 NSDictionary 或 NSArray,具体取决于服务器的响应格式。可以在这个块中对响应数据进行处理和解析。
 

failure 参数

 
  • 类型:void (^)(NSURLSessionDataTask *task, NSError *error) 类型的块。
  • 描述:这是请求失败后的回调块。当请求失败时,比如网络连接问题、服务器错误等,这个块会被调用。NSURLSessionDataTask 参数同样是表示当前请求任务的对象。NSError 参数包含了错误信息,可以通过检查这个错误对象来确定请求失败的原因,并进行相应的错误处理。

结语

 在研究spotify时,发现AFNetworking在处理一些需要涉及到请求头和请求体的网络请求会非常方便,与headers和parameters参数有关,这些知识之后会再进行完善。

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

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

相关文章

如何修改MAC地址破解网络无线网络限制-担心别人蹭网,路由器设置MAC地址过滤,限定了能访问无线网络的网卡地址-供大家学习参考

路由器都设置了MAC地址过滤,也就是限定了能访问无线网络的网卡的MAC地址。因为无线路由器不一定由自己控制,所以当更换了笔记本或者更换了无线网卡的时候,也许就上不了网了。我们可以修改网卡的MAC地址实现上网。 下载:https://do…

各种查询sql介绍

1. 关联查询(JOIN) 关联查询用于从多个表中检索数据。它基于两个或多个表之间的共同字段(通常是主键和外键)来组合数据。 内连接(INNER JOIN): sql SELECT a.name, b.order_date FROM custome…

计算机网络——CDN

空间编码例子:不是发送N个相同颜色值,而是仅发送2个值,颜色和重复个数 时间编码例子:不是发送i1帧的全部编码,而是仅发送帧i差别的地方 视频播放时,先下载manifest file文件——>解析(不…

机器学习与神经网络:科技的星辰大海

前提 近日,2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者,这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家,如今却将全球范围内对机器学习和神经网络的研究和开发作为了一…

Python库numpy之五

Python库numpy之五 数据类型数组类型和类型之间的转换数值数据类型字符串和字节的数据类型 数据类型 数组类型和类型之间的转换 NumPy 比 Python 支持更多种类的数值类型。 NumPy 数值类型是 numpy.dtype对象的实例,每个对象都具有独特的特征。可以使用 numpy 顶…

【Kuberntes】k8s权限管理

文章目录 权限管理概述核心概念配置RBAC创建Role和ClusterRole创建RoleBinding和ClusterRoleBinding 默认角色和角色绑定权限的实现注意事项 如何在 Kubernetes 中实现 RBAC 的细粒度权限控制?1. Role和ClusterRole2. RoleBinding和ClusterRoleBinding3. 配置RBAC4.…

gaussdb 基础管理 数据库 表 用户 模式 权限 存储过程

数据库database #创建数据库,指定字符集UTF8,缺省情况下新数据库将通过复制标准系统数据库template0来创建,且仅支持使用template0来创建。 CREATE DATABASE devdb ENCODING UTF8 template template0; CREATE DATABASE testdb; 标识符的命名…

Faster R-CNN模型微调检测航拍图像中的小物体

1. 项目简介 本项目的目标是基于Faster R-CNN模型对航拍图像中的小物体进行检测和识别。航拍图像通常具有视角广、分辨率高、小目标密集且物体尺寸较小的特点,因此检测难度较大。传统的目标检测模型在处理小物体时,容易受到物体尺寸、分辨率及背景复杂度…

HTML DOM 简介

HTML DOM 简介 1. 什么是HTML DOM? HTML DOM(文档对象模型)是一种用于HTML的应用程序编程接口(API)。它定义了访问和操作HTML文档的标准方法,将HTML文档表示为树结构,其中每个节点都是文档中的一个对象。通过DOM,开发者可以轻松地添加、删除和修改页面上的元素和内容…

CMake与Qt4/Qt5的结合使用指南

CMake与Qt4/Qt5的结合使用指南 一、同时使用Qt 4和Qt 5二、Qt构建工具2.1 AUTOMOC2.2 AUTOUIC2.3 AUTORCC 三、<ORIGIN>_autogen目标四、Visual Studio生成器五、Windows上的qtmain.lib六、其他文章推荐 在CMake中&#xff0c;您可以方便地找到并使用Qt 4和Qt 5库。Qt 4库…

大数据查询引擎之Tez

Apache Tez 是一个用于大数据处理的分布式计算框架&#xff0c;旨在提高 Hadoop 的 MapReduce 计算引擎的效率和性能。它是一个面向 DAG&#xff08;有向无环图&#xff09;任务执行的框架&#xff0c;主要用于大规模数据处理场景中&#xff0c;特别是在 Apache Hadoop 生态系统…

elementUI,设置日期,只能选择过去的和今天的日期

在 el-date-picker 组件中加&#xff1a;:picker-options"pickerOptions" <el-form-item label"票据生成日期&#xff1a;"> <el-date-picker v-model"date1" type"daterange" range-separator"至" value-format&…

Java中的函数式接口

在Java 8及以后的版本中&#xff0c;函数式编程成为了一个重要的特性。函数式接口是实现函数式编程的基础&#xff0c;它们允许你以声明式的方式处理数据集合&#xff0c;简化代码&#xff0c;提高代码的可读性和可维护性。本文将深入探讨Java中的函数式接口&#xff0c;包括它…

大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

轻量级可视化数据分析报表,分组汇总表!

什么是可视化分组汇总表&#xff1f; 可视化分组汇总表&#xff0c;是一种结合了数据分组、聚合计算与视觉呈现功能的数据分析展示功能。它能够按照指定的维度&#xff08;如时间、地区、产品类型等&#xff09;对数据进行分组&#xff0c;还能自动计算各组的统计指标&#xf…

【力扣 | SQL题 | 每日4题】力扣1164,3293,1308,1270

4 mid&#xff0c;四题都比较简单&#xff0c;没什么难度。 1. 力扣1164&#xff1a;指定日期的产品价格 1.1 题目&#xff1a; 产品数据表: Products ------------------------ | Column Name | Type | ------------------------ | product_id | int | | new_p…

mongodb-7.0.14分片副本集超详细部署

mongodb介绍&#xff1a; 是最常用的nosql数据库&#xff0c;在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb&#xff08;分片副本&#xff09;集群。 环境准备 系统系统 BC 21.10 三台服务器&#xff1a;192.168.123.247/248/249 安装包&#xff1a…

SQL Injection | SQL 注入 —— 报错盲注

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;报错盲注 —— 理论篇 报错盲注&#xff08;Error-Based Blind SQL Injection&#xff09;是一种常见的 SQL 注入技术&#xff0c;适用于那些页面不会直接显示后端处理结果的查询方式…

安装nginx实现多ip访问多网站

关闭防火墙并停selinux&#xff1a; 挂载&#xff1a; 安装nginx&#xff1a; 判断nginx是否成功启动&#xff1a; 打开nmtui并添加多个ip&#xff1a; 重启nmtui&#xff1a; 查看多ip是否配置成功: 配置文件&#xff1a; 创建文件&#xff1a; 根据配置在主机创建数据文件&a…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十一)ESKF中融合速度观测量;发散的原因;如何解决发散;以及对slam的理解

带着问题去学习: 1、slam发散的原因? 2、如何解决/限制发散? 3、如何在已经有观察值和预测值的ESKF中,再引入一个其他其他观察量? 一、多传感器融合的思考——轮速计 反思为何需要融合多个传感器? 我认为根本上的原因,是因为有些传感器在某些场景下会失灵、效果不佳…