概述

SwiftyNetworking 是一个强大且易于使用的 Swift 网络客户端。它简化了网络请求和响应处理,使您能够专注于构建应用程序,而不是处理复杂的网络问题。


集成

将 SwiftyNetworking 集成到您的 Swift 项目中非常简单。按照以下步骤开始

  1. 安装 SwiftyNetworking:
    • 如果您使用 Swift Package Manager (SPM)
      • 打开您的 Xcode 项目。
      • 导航到“File” > “Swift Packages” > “Add Package Dependency...”。
      • 输入 SwiftyNetworking 存储库 URL:https://github.com/antonio-war/SwiftyNetworking
      • 按照提示选择版本并将 SwiftyNetworking 添加到您的项目。
    • 如果您使用 CocoaPods 或 Carthage,我们很抱歉,但目前不支持。
  2. 导入 SwiftyNetworking:
    • 在您要使用 SwiftyNetworking 功能的文件中,在文件顶部导入其模块
      import SwiftyNetworking
  3. 开始使用 SwiftyNetworking:
    • 导入 SwiftyNetworking 后,您可以开始使用其方法来执行网络请求。
    • 有关结构体、类和方法的指导,请参阅用法部分。
  4. 运行您的项目:
    • 构建并运行您的项目,以确保 SwiftyNetworking 已成功集成。
    • 测试您使用 SwiftyNetworking 实现的功能,以确保一切正常。就这样!您已成功将 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
}

SwiftUI 集成

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()
    }
}

支持

您的慷慨捐赠有助于维持和改进此项目。以下是支持我们的重要原因

  1. 开发和维护:捐赠使我们能够投入更多时间和资源来开发新功能、修复错误并维护项目的整体健康状况。您的支持直接促进项目的持续改进和可持续性。
  2. 社区支持:您的贡献表明您对项目的支持,并有助于围绕它建立一个蓬勃发展的社区。您的慷慨激励我们不断推动项目前进,并鼓励其他人加入这项事业。
  3. 开源可持续性:通过支持像我们这样的开源项目,您正在为整个开源生态系统的可持续性做出贡献。您的捐赠有助于确保有价值的项目仍然可以供所有人使用。

每一笔捐款,无论多么微小,都会产生很大的影响。感谢您考虑支持我们!


许可证

SwiftyNetworking 在 MIT 许可证下发布。