[Swift 开发] async/await异步编程封装Alamofire
随着 iOS 开发的发展,异步编程已经成为日常开发的一项必备技能。在 iOS 中,最常见的异步编程方式是使用 Alamofire 框架。Alamofire 是一个强大的网络请求库,可以轻松实现异步编程。本文将介绍如何使用 async/await 封装 Alamofire,以实现更加优雅的异步编程。
首先,我们用Alamofire的URLRequestConvertible封装我们的数据
-
import Alamofire
-
-
enum Router: URLRequestConvertible {
-
-
static let baseURLString = "https://jsonplaceholder.typicode.com"
-
-
case getUserByPostID(postID: Int)
-
case comments
-
case getUserByID(userID: Int)
-
-
var method: Alamofire.HTTPMethod {
-
switch self {
-
case .getUserByPostID:
-
return .get
-
-
case .comments:
-
return .get
-
-
case .getUserByID:
-
return .post
-
}
-
}
-
-
var path: String {
-
switch self {
-
-
case .comments:
-
return "/comments"
-
-
// get请求,参数拼接在URL上
-
case .getUserByPostID(postID: let postId):
-
return "/comments?postId=\(postId)"
-
-
case .getUserByID:
-
return "/posts"
-
}
-
}
-
-
func asURLRequest() throws -> URLRequest {
-
let url = URL(string: Router.baseURLString path)!
-
var request = URLRequest(url: url)
-
request.method = method
-
request.timeoutInterval = 30 //15s超时
-
-
switch self {
-
case .comments:
-
break
-
-
case .getUserByPostID(postID: _):
-
break
-
-
//post 请求,参数加在这里
-
case .getUserByID(userID: let userID):
-
let para = ["userID": userID]
-
request = try JSONParameterEncoder().encode(para, into: request)
-
}
-
-
return request
-
-
}
-
}
上面的函数实现了 Alamofire 的URLRequestConvertible协议。它将返回一个URLRequest 参数
- 接下来,我们扩展一下Alamofire.DataRequest
- 它提供了一种简单的方法来管理HTTP网络请求。它提供了基本的HTTP方法,如GET,PUT,POST,DELETE等,以及一些高级的网络功能,如请求超时,文件上传, 数据解析等
- 我们把具体的网络请求业务代码,封装到一个函数中。这样代码看起来会很简洁
-
extension Alamofire.DataRequest {
-
-
func serializingDecodable<Value: Decodable>(_ type: Value.Type = Value.self) async throws -> Value {
-
let result = await serializingData().result
-
switch result {
-
case .success(let data):
-
do {
-
return try JSONDecoder().decode(Value.self, from: data)
-
} catch let error {
-
throw error
-
}
-
-
case .failure(let error):
-
throw error
-
}
-
}
-
}
然后,我们封装一下逻辑层,模拟了3个网络请求,其中包括(无参get, 有参get,无参post )
-
struct NetWork {
-
static func getUserInfo() async throws -> [Todo] {
-
let task = AF.request(Router.comments)
-
return try await task.serializingDecodable([Todo].self)
-
}
-
-
static func getUserInfoByPostId(_ postID:Int) async throws -> [Todo] {
-
let task = AF.request(Router.getUserByPostID(postID: postID))
-
return try await task.serializingDecodable([Todo].self)
-
}
-
-
static func getUserInfoByID(_ userID:Int) async throws -> [String:Int] {
-
let task = AF.request(Router.getUserByID(userID: userID))
-
return try await task.serializingDecodable([String:Int].self)
-
}
-
}
最后,我们可以使用 async/await 封装的函数来获取网络数据:
-
Task {
-
do{
-
let users1 = try await NetWork.getUserInfo()
-
print("AllUsersCount: \(users1.count)")
-
-
let users2 = try await NetWork.getUserInfoByPostId(3)
-
print("UserInfoByPostIdCount: \(users2.count)")
-
-
let users3 = try await NetWork.getUserInfoByID(1)
-
print("UserInfoByID: \(users3)")
-
-
}catch{
-
print(error)
-
}
-
}
-
-
-
// 打印结果:
-
// AllUsersCount: 500
-
// UserInfoByPostIdCount: 5
-
// UserInfoByID: ["userID": 1, "id": 101]
总结一下,本文介绍了如何使用 async/await 封装 Alamofire,以实现更加优雅的异步网络请求。通过使用 async/await,可以使得网络请求变得更加简洁、优雅,让开发者更加轻松地实现异步编程。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgicfff
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13