iOS常见网络框架

news2025/4/22 9:05:06

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 Foundation

let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error {
        print("请求失败: \(error)")
        return
    }
    
    guard let data = data else {
        print("无数据返回")
        return
    }

    // 解析 JSON
    do {
        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 in
    guard 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 in
    guard 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 in
            switch response.result {
                case let .success(data):
                print("data:\(String(describing: data))")
                case let .failure(error):
                print(error)
            }
        }
        //String示例
        AF.request(url).responseString { response in
            switch response.result {
                case let .success(data):
                print("data:\(String(describing: data))")
                case let .failure(error):
                print(error)
            }
        }
        //JSON示例
        AF.request(url).responseJSON { response in
            switch 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 in
            switch response.result {
                case let .success(data):
                print("data:\(String(describing: data))")
                case let .failure(error):
                print(error)
            }
        }

2.2 使用方式

2.2.1 发送 GET 请求

import Alamofire

AF.request("https://jsonplaceholder.typicode.com/todos/1").responseJSON { response in
    switch 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 in
    print("请求结果: \(response)")
}

2.2.3 文件上传

AF.upload(multipartFormData: { multipartFormData in
    let fileURL = URL(fileURLWithPath: "/path/to/file")
    multipartFormData.append(fileURL, withName: "file")
}, to: "https://example.com/upload")
.response { response in
    print("上传结果: \(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 Moya

enum API {
    case getPosts
    case 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 .get
        case .createPost: return .post
        }
    }

    var task: Task {
        switch self {
        case .getPosts, .getPost: return .requestPlain
        case .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 in
    switch 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.coloradmin.cn/o/2322421.html

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

相关文章

蓝桥杯备考---->激光炸弹(二维前缀和)

本题我们可以构造二维矩阵&#xff0c;然后根据题意&#xff0c;枚举所有边长为m的正方形&#xff0c;找到消灭价值最多的炸弹 #include <iostream> using namespace std; const int N 1e4; int a[N][N]; int n,m; int f[N][N]; int main() {cin >> n >> m…

数据结构 --树和森林

树和森林 树的存储结构 树的逻辑结构 树是一种递归定义的数据结构 树是n(n≥0)个结点的有限集。当n0时&#xff0c;称为空树。在任意一棵非空树中应满足&#xff1a; 1)有且仅有一个特定的称为根的结点。 2)当n>1时&#xff0c;其余结点可分为m(m>0)个互不相交的有…

QOpenGLWidget视频画面上绘制矩形框

一、QPainter绘制 在QOpenGLWidget中可以绘制&#xff0c;并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后&#xff0c;解锁资源&#xff0c;再用QPainter绘制矩形框。这种方式灵活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bi…

Linux系统加固笔记

检查口令为空的账户 判断依据&#xff1a;存在则不符合 特殊的shell a./bin/false:将用户的shell设置为/bin/false&#xff0c;用户会无法登录&#xff0c;并且不会有任何提示信息b./sbib/nologin&#xff1a;nologin会礼貌的向用户发送一条消息&#xff0c;并且拒绝用户登录…

【Go万字洗髓经】Golang中sync.Mutex的单机锁:实现原理与底层源码

本章目录 1. sync.Mutex锁的基本用法2. sync.Mutex的核心原理自旋到阻塞的升级过程自旋CAS 饥饿模式 3. sync.Mutex底层源码Mutex结构定义全局常量Mutex.Lock()方法第一次CAS加锁能够成功的前提是&#xff1f;竞态检测 Mutex.lockSlow()lockSlow的局部变量自旋空转state新值构造…

Django REST framework 源码剖析-认证器详解(Authentication)

Django REST framework 源码剖析-认证器详解(Authentication) 身份验证始终在视图的最开始运行&#xff0c;在权限和限制检查发生之前&#xff0c;以及在允许任何其他代码继续之前。request.user属性通常设置为contrib.auth包的user类的实例。request.auth属性用于任何其他身份…

TCP/IP三次握手的过程,为什么要3次?

一&#xff1a;过程 第一次&#xff08;SYN&#xff09;&#xff1a; 客户端发送一个带有SYN标志的TCP报文段给服务器&#xff0c;设置SYN1&#xff0c;并携带初始序列号Seqx&#xff08;随机值&#xff09;&#xff0c;进入SYN_SENT状态。等待服务器相应。 第二次&#xff08…

Centos6安装nerdctl容器运行时

Centos6安装nerdctl容器运行时 前言Centos6安装docker---失败--不可拉取镜像docker配置国内镜像加速 Centos6安装nerdctl-full容器管理工具为Centos6配置containerd服务开机自启动设置nerdctl自动补全 前言 本文写于2025年3月22日,因一些特殊业务需要用到Centos6Docker,但Cent…

登录验证码的接口实习,uuid,code.

UID是唯一标识的字符串,下面是百度百科关于UUID的定义&#xff1a; UUID是由一组32位数的16进制数字所构成&#xff0c;是故UUID理论上的总数为16322128&#xff0c;约等于3.4 x 10^38。也就是说若每纳秒产生1兆个UUID&#xff0c;要花100亿年才会将所有UUID用完。 UUID的标准…

用fofa语法搜索漏洞

FOFA是一款非常强大的搜索引擎 关于对于fofa的描述是&#xff1a;FOFA&#xff08;网络空间资产检索系统&#xff09;是世界上数据覆盖更完整的IT设备搜索引擎&#xff0c;拥有全球联网IT设备更全的DNA信息。 探索全球互联网的资产信息&#xff0c;进行资产及漏洞影响范围分析…

20242817李臻《Linux⾼级编程实践》第6周

20242817李臻《Linux⾼级编程实践》第6周 一、AI对学习内容的总结 Linux进程间通信&#xff08;IPC&#xff09; 1. 进程间通信基本概念 作用: 数据传输&#xff1a;进程间传递数据&#xff08;字节到兆字节级别&#xff09;。共享数据&#xff1a;多个进程操作同一数据&…

深入解析SQL2API平台:数据交互革新者

在数字化转型持续深入的当下&#xff0c;企业对数据的高效利用与管理的需求愈发迫切。SQL2API平台应运而生&#xff0c;成为助力企业突破数据交互困境的有力工具&#xff0c;特别是它由麦聪软件基于DaaS&#xff08;数据即服务&#xff09;产品创新衍生而来&#xff0c;备受业界…

Java 中装饰者模式与策略模式在埋点系统中的应用

前言 在软件开发中&#xff0c;装饰者模式和策略模式是两种常用的设计模式&#xff0c;它们在特定的业务场景下能够发挥巨大的作用。本文将通过一个实际的埋点系统案例&#xff0c;探讨如何在 Java 中运用装饰者模式和策略模式&#xff0c;以及如何结合工厂方法模式来优化代码…

无人设备遥控器之调度自动化技术篇

一、技术原理 信息采集与处理&#xff1a; 通过传感器、仪表等设备采集无人设备的各种数据&#xff0c;如位置、速度、状态等。 将采集到的数据传输到调度自动化系统中进行处理和分析&#xff0c;以获取设备的实时状态。 系统建模与优化&#xff1a; 调度自动化系统会根据…

【AI】Orin Nano+ubuntu22.04上移植YoloV11,并使用DeepStream测试成功

【AI】郭老二博文之:AI学习目录汇总 1、准备工作 使用 sdk-manager 烧写 OrinNano, JetPack版本为6.0 DP,对应操作系统为:Ubuntu22.04 参见博客:【NVIDIA】Jetson Orin Nano系列:烧写Ubuntu22.04 2、安装 PyTorch 2.1 下载依赖 1)安装onnx pip install onnx -i h…

K8S学习之基础四十五:k8s中部署elasticsearch

k8s中部署elasticsearch 安装并启动nfs服务yum install nfs-utils -y systemctl start nfs systemctl enable nfs.service mkdir /data/v1 -p echo /data/v1 *(rw,no_root_squash) >> /etc/exports exports -arv systemctl restart nfs创建运行nfs-provisioner需要的sa账…

如何在 Windows 上安装并使用 Postman?

Postman 是一个功能强大的API测试工具&#xff0c;它可以帮助程序员更轻松地测试和调试 API。在本文中&#xff0c;我们将讨论如何在 Windows 上安装和使用 Postman。 Windows 如何安装和使用 Postman 教程&#xff1f;

Axure RP 9.0教程: 基于动态面板的元件跟随来实现【音量滑块】

文章目录 引言I 音量滑块的实现步骤添加底层边框添加覆盖层基于覆盖层创建动态面板添加滑块按钮设置滑块拖动效果引言 音量滑块在播放器类APP应用场景相对较广,例如调节视频的亮度、声音等等。 I 音量滑块的实现步骤 添加底层边框 在画布中添加一个矩形框:500 x 32,圆…

WPF 与 C# 开发深度剖析

一、引言 在当今的软件开发领域&#xff0c;Windows 平台依旧占据着重要的地位。而 WPF&#xff08;Windows Presentation Foundation&#xff09;作为微软推出的一款强大的用户界面&#xff08;UI&#xff09;框架&#xff0c;为开发者提供了丰富的功能和灵活的设计方式&…

好消息!软航文档控件(NTKO WebOffice)在Chrome 133版本上提示扩展已停用的解决方案

软航文档控件现有版本依赖Manifest V2扩展技术支持才能正常运行&#xff0c;然而这个扩展技术到2025年6月在Chrome高版本上就彻底不支持了&#xff0c;现在Chrome 133开始的版本已经开始弹出警告&#xff0c;必须手工开启扩展支持才能正常运行。那么如何解决这个技术难题呢&…