SwiftyNetworking 是一个强大且易于使用的 Swift 网络客户端。它简化了网络请求和响应处理,使您能够专注于构建应用程序,而不是处理复杂的网络问题。
将 SwiftyNetworking 集成到您的 Swift 项目中非常简单。按照以下步骤开始
https://github.com/antonio-war/SwiftyNetworking
。import SwiftyNetworking
以下概述了在项目中使用 SwiftyNetworking 的主要步骤,指导您完成整个过程。
首先,定义一个 SwiftyNetworkingRequest
,它是 URLRequest
的一个简单包装器,允许您轻松设置发出 API 调用所需的一切。例如,经典的方法、标头和正文,以及一些与 iOS 生态系统密切相关的参数,例如缓存策略或超时管理。
let request = try SwiftyNetworkingRequest(
url: URL(string: "https://jsonplaceholder.typicode.com"),
method: .get,
headers: [:],
body: nil,
cachePolicy: .reloadIgnoringCacheData,
timeout: 60
)
或者,您可以初始化请求,指定主机、路径和参数,而无需定义 URL。
使用默认或自定义 URLSessionConfiguration 创建一个 SwiftyNetworkingClient
实例。单个实例应该足以管理应用程序的整个网络层,因此理论上可以将客户端放置在依赖注入容器中。
let networkingClient = SwiftyNetworkingClient()
使用定义的异步方法执行请求。
let response = try await networkingClient.send(request)
相同的办法也提供了带有 completion 而不是 async/await 的经典版本。
如果成功,该方法将返回一个 SwiftyNetworkingResponse
,它是 HTTPURLResponse
的一个简单包装器,允许您轻松访问一些元素,如正文、标头和一些指标。 SwiftyNetworking 始终返回响应的来源及其持续时间,使您能够了解它是来自网络还是来自缓存。
if response.status == .success && let body = response.body {
return String(data: body, encoding: .utf8)
}
在业务环境中,SwiftyNetworking 的基本功能可能不足,这就是为什么集成了额外的结构。
在应用程序对同一 API 发出大量不同类型的请求的情况下,必须定义越来越多的请求可能会很麻烦。这就是我们引入 SwiftyNetworkingRouter
的原因,它基本上是一个协议,允许您定义多个假设指向同一 API 且因此共享资源的请求。
enum JsonPlaceholderRouter: SwiftyNetworkingRouter {
case users
case user(id: Int)
var host: String {
"jsonplaceholder.typicode.com"
}
var path: String {
switch self {
case .users:
"users/"
case .user(let id):
"users/\(id)"
}
}
}
向暴露的路由之一发出请求将非常容易!
let request = try JsonPlaceholderRouter.users.request
let response = try await client.send(request)
在大多数情况下,一旦您进行网络调用,您需要读取响应体的内容,显然在 iOS 环境中,这是通过使用 Decodable 协议及其 Decoder 的强大功能来实现的,这就是 SwiftyNetworking 也提供集成解码的方法的原因。当解码操作必须以简单的方式完成,没有任何自定义行为时,它们非常有用,SwiftyNetworking 将免除您的任何责任。
let request = try JsonPlaceholderRouter.users.request
let users = try await networkingClient.send(request, decoding: [JsonPlaceholderUser].self, using: JSONDecoder())
默认情况下,该方法使用自己的 JSONDecoder 实例,但是,如所示,如果需要特定的解码配置,可以注入自定义解码器。您要解码的模型必须符合 SwiftyNetworkingModel
协议,这可确保与 Swift 6 严格的并发检查兼容。这是一个简单的模型定义示例
struct JsonPlaceholderUser: Identifiable, SwiftyNetworkingModel {
var id: Int
var name: String
}
SwiftyNetworking 的诞生是为了成为一个现代框架,因此它面向使用 SwiftUI 的开发。 Request
属性包装器允许您发出网络请求并在视图中直接解码响应,而无需编写任何代码。它的灵感来自 SwiftData 的 @Query,旨在为用户提供一个熟悉的界面。
@Request(
client: SwiftyNetworkingClient(),
url: URL(string: "https://jsonplaceholder.typicode.com/posts"),
method: .get,
headers: ["Content-Type": "application/json"],
cachePolicy: .returnCacheDataElseLoad,
timeout: 10,
decoder: JSONDecoder()
)
var response: Response<[Post]>
每个请求都与一个 Response 对象相关联,该对象是一个简单的三态枚举(加载、成功和失败)。
请求在创建视图后会自动执行,因此您可以直接访问视图主体内的响应,并通过简单的 switch 为每个状态显示视图的不同方面。
List {
switch response {
case .loading:
LoadingCell()
case .success(let posts):
ForEach(posts, id: \.id) { post in
PostCell(post)
}
case .failure(let error):
ErrorCell(error)
}
}
如果您的请求失败或者您只想更新结果,您可以使用其 projectedValue 来调用 refresh 方法,这将导致视图被重绘并且结果被更新。
Button("Refresh") {
Task {
await $response.refresh()
}
}
您的慷慨捐赠有助于维持和改进此项目。以下是支持我们的重要原因
每一笔捐款,无论多么微小,都会产生很大的影响。感谢您考虑支持我们!
SwiftyNetworking 在 MIT 许可证下发布。