GraphQL在Swift中的使用:Apollo iOS库完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

用于在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

推荐