GraphQL 和 Swift 简介
\nGraphQL 是一种 API 查询语言,它允许客户端精确获取所需的数据,不多不少。对于 iOS 和 macOS 开发者来说,集成 GraphQL 为创建高效灵活的移动应用开辟了新的可能性。在本教程中,我们将通过实践学习如何将 GraphQL API 连接到 Swift 项目,执行基本查询和变更,并处理可能出现的错误。
\n与传统的 REST 不同,GraphQL 允许通过一次请求获取多个资源,这对于流量受限的移动设备尤为重要。我们将使用流行的 Apollo iOS 库——这是 Swift 中处理 GraphQL 最稳定且文档最完善的解决方案。
\n\n项目准备与 Apollo iOS 安装
\n步骤 1:创建项目并安装依赖
\n打开 Xcode 并创建一个新的 iOS(或 macOS)项目。我们将通过 Swift Package Manager (SPM) 安装 Apollo iOS 以使用 GraphQL。
\n- \n
- 在 Xcode 中选择
File → Add Packages\n - 粘贴仓库 URL:
https://github.com/apollographql/apollo-ios.git\n - 选择最新的稳定版本(撰写本文时为 1.15+) \n
- 将包添加到您的目标中 \n
步骤 2:根据 GraphQL 模式生成代码
\nApollo iOS 使用代码生成:您在 .graphql 文件中描述查询,工具会生成类型化的 Swift 代码。为此,您需要:
- \n
- 在项目中创建
GraphQL文件夹 \n - 将
schema.graphqls文件(您的 API 模式)放入其中——通常可以通过 introspection 获取 \n - 创建一个查询文件,例如
GetUser.graphql: \n
query GetUser($id: ID!) {\n user(id: $id) {\n id\n name\n email\n posts {\n title\n }\n }\n}\n\n然后添加一个运行代码生成器的 Build Phase。最简单的方法是通过 Homebrew 安装 Apollo CLI:
\nbrew install apollo-ios-cli\n\n并在项目根目录执行命令:
\n./apollo-ios-cli generate\n\n之后,在 Sources/API 文件夹中将出现包含数据模型的生成 Swift 文件。
执行基本 GraphQL 查询
\n配置 Apollo 客户端
\n创建一个 Apollo 客户端实例,指定您的 GraphQL 端点 URL。通常在 AppDelegate 或单独的服务类中完成:
\n\nimport Apollo\n\nclass NetworkService {\n static let shared = NetworkService()\n private(set) lazy var apollo: ApolloClient = {\n let url = URL(string: "https://your-api.com/graphql")!\n return ApolloClient(url: url)\n }()\n}\n\n数据查询 (Query)
\n现在执行一个获取用户的查询。生成的代码会创建 GetUserQuery 结构体:
import Foundation\n\nclass UserViewModel: ObservableObject {\n @Published var user: User?\n @Published var errorMessage: String?\n \n func fetchUser(id: String) {\n NetworkService.shared.apollo.fetch(query: GetUserQuery(id: id)) { [weak self] result in\n DispatchQueue.main.async {\n switch result {\n case .success(let graphQLResult):\n if let userData = graphQLResult.data?.user {\n self?.user = User(\n id: userData.id,\n name: userData.name,\n email: userData.email\n )\n }\n case .failure(let error):\n self?.errorMessage = "错误: \\(error.localizedDescription)"\n }\n }\n }\n }\n}\n\n请注意:我们使用 @Published 来实现 UI 的响应式更新,在