用于在Swift中处理GraphQL的Apollo iOS库
Apollo iOS 是一个强大且灵活的库,用于在Apple生态系统中处理GraphQL。它为iOS和macOS开发者提供了便捷的工具,用于向GraphQL服务器执行查询、变更和订阅。与REST API不同,GraphQL允许客户端仅请求所需数据,从而减少流量并加快应用程序运行速度。Apollo iOS完全支持Swift,包括现代语言特性,如async/await、Combine和SwiftUI。
Apollo iOS的主要功能
- 代码生成:基于GraphQL模式自动创建类型安全的数据模型。
- 缓存:内置对规范化缓存的支持,用于优化重复查询。
- 支持Swift并发:与async/await完全集成,用于异步操作。
- 通过WebSocket订阅:使用GraphQL subscriptions实现实时更新。
- Combine和SwiftUI:可与Apple的响应式框架一起使用。
- 多平台支持:适用于iOS、macOS、tvOS和watchOS。
安装库
要安装Apollo iOS,请使用Swift Package Manager。通过菜单 File → Add Packages 将包添加到Xcode,并指定URL:
https://github.com/apollographql/apollo-ios.git版本:最新稳定版(撰写时为1.15.0)。
配置Apollo Client
第一步是使用GraphQL服务器的URL创建ApolloClient实例。基本配置示例:
import Apollo
class NetworkService { static let shared = NetworkService() private(set) lazy var apollo: ApolloClient = { let url = URL(string: "https://api.example.com/graphql")! return ApolloClient(url: url) }()}执行查询(Queries)
Apollo iOS基于GraphQL模式生成代码。首先在 .graphql 文件中定义查询:
query GetUser($id: ID!) { user(id: $id) { id name email posts { title } }}代码生成后,执行查询:
import Apollo
func fetchUser(id: String) async throws -> GetUserQuery.Data.User? { let query = GetUserQuery(id: id) let result = try await NetworkService.shared.apollo.fetch(query: query) return result.data?.user}变更(Mutation)
要修改数据,请使用变更。创建新帖子的示例:
mutation CreatePost($title: String!, $content: String!) { createPost(input: { title: $title, content: $content }) { id title createdAt }}在Swift中执行变更:
func createPost(title: String, content: String) async throws -> CreatePostMutation.Data.CreatePost? { let mutation = CreatePostMutation(title: title, content: content) let result = try await NetworkService.shared.apollo.perform(mutation: mutation) return result.data?.createPost}处理订阅(Subscriptions)
对于实时更新,请使用订阅。订阅新消息的示例:
subscription OnNewMessage { newMessage { id text sender { name } }}在Swift中使用Combine实现:
import Combine
var cancellables = Set<AnyCancellable>()
func subscribeToMessages() { let subscription = OnNewMessageSubscription() NetworkService.shared.apollo.subscribe(subscription: subscription) .sink { completion in print("Subscription