iOS常见网络框架

URLSession、Alamofire 和 Moya


1. URLSession

1.1 核心概念

URLSession 是 Apple 官方提供的网络请求 API,封装在 Foundation 框架中。它支持 HTTP、HTTPS、FTP 等协议,可用于:

​ • 普通网络请求(GET/POST)

​ • 后台下载、断点续传

​ • WebSocket 连接

​ • 数据上传(multipart/form-data)

​ • 流式传输

1.2 组成部分

URLSession 主要由以下三部分组成:

​ 1. URLSession:管理网络任务的会话对象。

​ 2. URLSessionTask

​ • URLSessionDataTask:处理普通的 HTTP 请求,获取 Data 数据

​ • URLSessionDownloadTask:支持后台下载、断点续传

​ • URLSessionUploadTask:上传文件

​ • URLSessionStreamTask:处理 TCP 连接和 WebSocket 连接

​ 3. URLSessionDelegate

​ • 处理身份认证、数据接收、下载进度、错误处理等。


1.3 使用方式

URLSessionDataTask是平时使用频率最高的,平时使用的POST还有GET请求都是通过它来实现的。

1.3.1 发送 GET 请求

import Foundationlet url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")!
let task = URLSession.shared.dataTask(with: url) { data, response, error inif let error = error {print("请求失败: \(error)")return}guard let data = data else {print("无数据返回")return}// 解析 JSONdo {let json = try JSONSerialization.jsonObject(with: data, options: [])print("请求成功: \(json)")} catch {print("JSON 解析失败: \(error)")}
}task.resume()

1.3.2 发送 POST 请求

let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")let parameters = ["title": "foo", "body": "bar", "userId": 1]
request.httpBody = try? JSONSerialization.data(withJSONObject: parameters)let task = URLSession.shared.dataTask(with: request) { data, response, error inguard let data = data, error == nil else {print("请求失败: \(error!)")return}let json = try? JSONSerialization.jsonObject(with: data, options: [])print("请求成功: \(json!)")
}task.resume()

URLSessionDownloadTask用于下载,有两种方式:Block 和 代理,URLSession 在下载文件的时候,是将数据一点点地写入本地的一个临时文件,这个临时文件系统会很很快删除,所以我们需要把文件从这个临时地址移动到一个永久的地址保存起来,这样才算完整的下载完一个文件,另外,使用 NSURLSessionConfiguration 的 background 模式可以做到后台下载,并且即使应用被 Kill 之后也还可以恢复之前的下载任务。

1.3.3 下载文件

let url = URL(string: "https://example.com/file.zip")!
let task = URLSession.shared.downloadTask(with: url) { localURL, response, error inguard let localURL = localURL else { return }print("文件下载成功,存储在: \(localURL.path)")
}
task.resume()

1.4 优缺点

优点

​ • 官方提供,稳定可靠

​ • 支持后台下载、断点续传

​ • 无额外依赖,轻量级

​ • 高度可定制,适用于各种网络任务

缺点

​ • 代码较冗长,每次请求都需要手动解析 Data

​ • 不支持链式调用

​ • 不支持内置 JSON 解析和参数编码

​ • 不适合复杂的 REST API 结构


2. Alamofire

2.1 核心概念

Alamofire 是基于 URLSession 的封装,简化了常见的网络请求,提供链式调用、JSON 解析、文件上传等功能。

在这里插入图片描述
我们查看代码发现,AF直接就是Session.default。所以Alamofire就是基于NSURLSession进行封装的。

返回类型

        //Data示例let url = "https://httpny.org/get"AF.request(url).responseData { response inswitch response.result {case let .success(data):print("data:\(String(describing: data))")case let .failure(error):print(error)}}//String示例AF.request(url).responseString { response inswitch response.result {case let .success(data):print("data:\(String(describing: data))")case let .failure(error):print(error)}}//JSON示例AF.request(url).responseJSON { response inswitch response.result {case let .success(data):print("data:\(String(describing: data))")case let .failure(error):print(error)}}//自定义格式示例AF.request(url).responseDecodable(of: PersonResponse.self) { response inswitch response.result {case let .success(data):print("data:\(String(describing: data))")case let .failure(error):print(error)}}

2.2 使用方式

2.2.1 发送 GET 请求

import AlamofireAF.request("https://jsonplaceholder.typicode.com/todos/1").responseJSON { response inswitch response.result {case .success(let data):print("请求成功: \(data)")case .failure(let error):print("请求失败: \(error)")}
}

2.2.2 发送 POST 请求

let parameters: [String: Any] = ["title": "foo", "body": "bar", "userId": 1]AF.request("https://jsonplaceholder.typicode.com/posts",method: .post,parameters: parameters,encoding: JSONEncoding.default)
.responseJSON { response inprint("请求结果: \(response)")
}

2.2.3 文件上传

AF.upload(multipartFormData: { multipartFormData inlet fileURL = URL(fileURLWithPath: "/path/to/file")multipartFormData.append(fileURL, withName: "file")
}, to: "https://example.com/upload")
.response { response inprint("上传结果: \(response)")
}

2.3 优缺点

优点

​ • 代码简洁,封装良好

​ • 支持 JSON 解析

​ • 支持文件上传、下载

​ • 支持请求队列和队列优先级

缺点

​ • 比 URLSession 体积大

​ • 自定义控制较少

​ • 不适用于 API 统一管理


3. Moya

3.1 核心概念

Moya 是基于 Alamofire 的进一步封装,旨在统一 API 管理,适合大型项目。
Moya和Alamofire之间的紧密联系只是因为Moya本身并没有真正进行任何联网。它使用Alamofire经过实战检验的网络功能,并且仅提供其他功能,类型和概念来进一步抽象Alamofire。

3.2 使用方式

3.2.1 定义 API

import Moyaenum API {case getPostscase getPost(id: Int)case createPost(title: String, body: String, userId: Int)
}extension API: TargetType {var baseURL: URL { return URL(string: "https://jsonplaceholder.typicode.com")! }var path: String {switch self {case .getPosts: return "/posts"case .getPost(let id): return "/posts/\(id)"case .createPost: return "/posts"}}var method: Moya.Method {switch self {case .getPosts, .getPost: return .getcase .createPost: return .post}}var task: Task {switch self {case .getPosts, .getPost: return .requestPlaincase .createPost(let title, let body, let userId):return .requestParameters(parameters: ["title": title, "body": body, "userId": userId],encoding: JSONEncoding.default)}}
}

3.2.2 发送请求

let provider = MoyaProvider<API>()provider.request(.getPosts) { result inswitch result {case .success(let response):let json = try? response.mapJSON()print("请求成功: \(json!)")case .failure(let error):print("请求失败: \(error)")}
}

3.3 优缺点

优点

​ • 适合 API 统一管理

​ • 结构清晰,代码更模块化

​ • 支持 RxSwift 和 Combine

缺点

​ • 比 Alamofire 更重

​ • 学习成本较高


总结

框架适用场景主要优势主要劣势
URLSession基础网络请求轻量级、无依赖代码繁琐,需要手动解析 JSON
Alamofire现代 REST API代码简洁、支持 JSON依赖库较大,不适合 API 统一管理
Moya大型项目适合 MVVM 架构,API 统一管理复杂度高,学习成本高

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

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

相关文章

AOA(到达角度)与TOA(到达时间)两个技术的混合定位,MATLAB例程,自适应基站数量,三维空间下的运动轨迹,滤波使用UKF(无迹卡尔曼滤波)

本文介绍一个MATLAB代码,实现了三维动态目标非线性定位与滤波系统,通过融合 到达角(AOA) 和 到达时间(TOA) 的混合定位方法,结合 无迹卡尔曼滤波(UKF) 处理非线性观测模型,优化轨迹精度。代码支持自适应基站数量配置,适用于复杂非线性场景的定位研究。 文章目录 运行…

Ubuntu 重置密码方法

目录 修改过 root 密码&#xff0c;重置密码的方法没改过 root 密码‌&#xff0c;重置密码的方法 修改过 root 密码&#xff0c;重置密码的方法 Ubuntu 默认禁用root用户&#xff0c;意思就是安装好Ubuntu系统后&#xff0c;root用户默认是没有密码的&#xff0c;普通用户通过…

Leetcode 路径总和 III

java 解法一&#xff1a;双递归 class Solution {public int pathSum(TreeNode root, long targetSum) { //外层递归,把每个节点都当作路径起点if(root null) return 0;int ret rootSum(root, targetSum);ret pathSum(root.left, targetSum);ret pathSum(root.right, targ…

WEB安全--SQL注入--利用log写入webshell

一、原理&#xff1a; 这也是对之前文章的补充&#xff1a;WEB安全--SQL注入--INTO OUTFILE-CSDN博客 我们可以通过修改MySQL的log文件&#xff0c;用select关键字写入木马文件放在服务器物理地址中&#xff0c;通过访问物理地址getshell。 二、条件&#xff1a; 用户有写入权限…

C++11中引入的比较常用的新特性讲解(上)

目录 1、C11简介 2、统一的列表初始化 2.1、&#xff5b;&#xff5d;初始化 2.2、std::initializer_list 3、变量类型推导 3.1、auto 3.2、decltype 3.3、nullptr 4、范围for循环 5、STL中一些变化 6、右值引用和移动语义 6.1、左值引用和右值引用 6.2、右值引用…

hugo+github pages 部署实验室网站

&#xff01;&#xff01;太爽了&#xff0c;看了很久教程&#xff0c;自己试了好久&#xff0c;终于搞懂怎么把hugo和public单独进行部署了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 目的是什么&#xff1f;目的当然是为了修改这天杀的hugo的模板。现在…

两头文件互引问题解决(前置声明)

问题&#xff1a; 想必正在基础阶段学习的朋友们都遇见过以下问题吧 widget.h otherwidget.h 如上问题是&#xff0c;我在widget.h中引用了otherwidget.h ,在ohterwidget中又引用了widget.h&#xff0c;两个头文件互相引用产生了报错 解决办法&#xff1a; 那么我们该如何解…

Python 异常处理完全指南

目录 一、异常处理基础1. 基本语法结构 二、常见异常类型1. 内置异常层次2. 常见异常示例 三、多重异常处理1. 合并捕获2. 分层处理 四、finally与else子句1. finally 应用场景2. else 使用技巧 五、自定义异常1. 创建异常类2. 异常继承体系 六、异常链与上下文1. raise from 语…

【Qt】Ubuntu22.04使用命令安装Qt5和Qt6

1、安装Qt5 注意:Ubuntu22.04已经没有 qt5-default ,因此不能一键安装啦 1)安装核心组件 sudo apt install qtbase5-dev qtchooser qt5-qmake qtcreator2)安装QtCreator sudo apt install qtcreator3)安装工具包、Qt Quick 开发的核心库(qtdeclarative5-dev) sudo a…

手撸一个 deepseek 数据库对话,打造一个企业智能通讯录(ollama + deepseek + langchain)

前言 由于 deepseek 等大语言模型数据时效性问题&#xff0c;无法跟上现实世界信息的动态变化&#xff0c;企业内部信息更是无法理解&#xff0c;为了将 deepseek 应用到企业内部&#xff0c;之前有写过通过联网搜索、上传文件、搭建知识等检索增强生成&#xff08;RAG&#xf…

线段树SegmentTree

线段树当中的几个重要操作 1.PushUp 上推操作&#xff1a;由子节点算父节点的信息 p u s h u p push up pushup 操作的目的是为了维护父子节点之间的逻辑关系。当我们递归建树时&#xff0c;对于每一个节点我们都需要遍历一遍&#xff0c;并且电脑中的递归实际意义是先向底层…

SSH免密登录服务器方法

Window免密连接Linux系统 生成公匙 ssh-keygen -t rsa一路回车生成公钥 复制公匙&#xff0c;使用记事本打开复制全部内容 notepad C:\Users\DELL\.ssh\id_rsa.pub内容如"ssh-rsa AAAAB3NzaC1yc2EAAAA…" 远程登录服务器将内容写入~/.ssh/authorized_keys echo …

Go 1.24 新特性解析:泛型类型别名、弱指针与终结器改进

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

MySQL 表 t1 建立联合索引 (a, b, c),在 where a < ? and b > ? and c < ? 中哪些索引生效

文章目录 联合索引 abc 均范围扫描时的索引生效情况无回表 表数据量非常少无回表 表数据量多有回表总结 联合索引 abc 均范围扫描时的索引生效情况 场景&#xff1a;表 t1 建立联合索引 (a, b, c)&#xff0c;在 where a < ? and b > ? and c < ? 中哪些索引生效…

海外营收占比近4成,泡泡玛特全球化战略迎收获期

3月26日&#xff0c;泡泡玛特国际集团发布2024全年财报。财报显示&#xff0c;2024年泡泡玛特实现营收130.4亿元&#xff08;人民币&#xff0c;下同&#xff09;&#xff0c;同比增长106.9%&#xff0c;经调整净利润34.0亿元&#xff0c;同比增长185.9%。中国内地营收79.7亿元…

ctf-web: 不统一的解析 + sql注入要求输入与输出相等 -- tpctf supersqli

# 从 django.shortcuts 模块导入 render 函数&#xff0c;用于渲染模板 from django.shortcuts import render # 从 django.db 模块导入 connection 对象&#xff0c;用于数据库连接 from django.db import connection# 此模块用于创建视图函数 # 从 django.http 模块导入 Http…

LLM推理加速框架有哪些

LLM推理加速框架有哪些 目录 LLM推理加速框架有哪些1. TensorRT简介简单使用示例2. Triton Inference Server简介简单使用示例3. SGLang简介简单使用示例4. vLLM简介简单使用示例1. TensorRT 简介 TensorRT 是 NVIDIA 推出的一个用于高性能深度学习推理的 SDK。它能够对训练好…

【深度学习与实战】2.1、线性回归模型与梯度下降法先导案例--最小二乘法(向量形式求解)

为了求解损失函数 对 的导数&#xff0c;并利用最小二乘法向量形式求解 的值&#xff0c;我们按照以下步骤进行&#xff1a; ‌1. 损失函数的含义‌ 这是‌线性回归‌的平方误差损失函数&#xff0c;目标是最小化预测值 与真实值 之间的差距。 ‌定义损失函数‌&#xf…

S7-1200对V90 PN进行位置控制的三种方法

S7-1200系列PLC通过PROFINET与V90 PN伺服驱动器搭配进行位置控制,实现的方法主要有以下三种: ? 方法一、在PLC中组态位置轴工艺对象,V90使用标准报文3,通过MC_Power、MC_MoveAbsolute等PLC Open标准程序块进行控制, 这种控制方式属于中央控制方式(位置控制在PLC中计算,驱…

爱普生FC-135晶振5G手机的极端温度性能守护者

在5G时代&#xff0c;智能手机不仅需要高速率与低延迟&#xff0c;更需在严寒、酷暑、振动等复杂环境中保持稳定运行。作为 5G 手机的核心时钟源&#xff0c;爱普生32.768kHz晶振FC-135凭借其宽温适应性、高精度稳定性与微型化设计&#xff0c;成为5G手机核心时钟源的理想选择&…