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.pswp.cn/pingmian/73540.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73540.shtml
英文地址,請注明出處:http://en.pswp.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手機核心時鐘源的理想選擇&…