适用于 Swift (iOS/macOS) 的 GraphQL 库:完整指南
GraphQL 是一种用于 API 的现代查询语言,它允许客户端仅请求他们需要的数据。对于创建 iOS 和 macOS 应用的 Swift 开发者来说,有一些强大的库可以简化与 GraphQL 服务器的集成。在本文中,我们将介绍两个主要库:Apollo iOS 和 Relay(通过 Swift 封装),并提供实用的代码示例。
什么是 GraphQL,为什么它对 Swift 很重要?
GraphQL 解决了使用 REST API 时经常出现的数据过度获取和获取不足的问题。在 Swift 中,这对于移动应用尤其重要,因为每多一个千字节的数据都可能影响性能和加载时间。GraphQL 对 iOS/macOS 的主要优势:
- 灵活的查询 — 客户端自行决定获取哪些字段
- 强类型 — GraphQL 模式自动生成 Swift 类型
- 支持订阅 — 通过 WebSocket 实现实时更新
- 单一入口点 — 所有查询共用一个 endpoint
Apollo iOS 库
Apollo iOS 是 Swift 中最流行的 GraphQL 库,由 Apollo GraphQL 公司开发。它提供了一套完整的工具来处理 GraphQL:从代码生成到缓存和错误处理。
安装 Apollo iOS
使用 Swift Package Manager 进行安装。将依赖项添加到您的 Package.swift 中:
// swift-tools-version:5.7import PackageDescription
let package = Package( name: "MyApp", dependencies: [ .package(url: "https://github.com/apollographql/apollo-ios.git", from: "1.0.0") ], targets: [ .target(name: "MyApp", dependencies: [ .product(name: "Apollo", package: "apollo-ios") ]) ])也可以通过 CocoaPods 或 Carthage 安装,但 SPM 是推荐的方式。
配置 Apollo 客户端
使用您的 GraphQL 服务器的 URL 创建 ApolloClient 实例:
import Apollo
class NetworkManager { static let shared = NetworkManager() private(set) lazy var apollo: ApolloClient = { let url = URL(string: "https://api.example.com/graphql")! return ApolloClient(url: url) }()}使用 Apollo iOS 的查询示例
假设您有一个包含 User 类型以及 id、name、email 字段的模式。创建一个查询:
import Apollo
// 定义 GraphQL 查询(通常在 .graphql 文件中)let query = """ query GetUser($id: ID!) { user(id: $id) { id name email } }"""
// 执行查询NetworkManager.shared.apollo.fetch(query: query, variables: ["id": "123"]) { result in switch result { case .success(let graphQLResult): if let user = graphQLResult.data?.user { print("User: \\(user.name), Email: \\(user.email)") } case .failure(let error): print("Error: \\(error)") }}请注意:如果您使用其代码生成工具,Apollo 会自动为您的查询生成 Swift 类型(例如 GetUserQuery)。为此,请使用您的模式运行 apollo-ios-cli。
变更和订阅
Apollo 支持变更(数据修改)和订阅(实时)。变更示例:
let mutation = """ mutation UpdateUser($id: ID!, $name: String!) { updateUser(id: $id, name: $name) { id name } }"""
NetworkManager.shared.apollo.pe