更新
除了使用查询抓取数据,Apollo iOS 也处理 GraphQL 更新mutations。更新在语法上与查询相同,唯一区别在于你使用关键字 mutation
而不是 query
来指示在此查询中的 根字段 将会对后端执行写入操作。
有关 GraphQL 更新的更多详细信息,我们建议您阅读此指南阅读此指南。
GraphQL 更新代表了两个操作:
- 具有 args(参数) 的 mutation 字段名,代表在服务器上要执行的实际操作。
- 你想从更新的结果中获取的字段,以更新客户端。
所有修改数据的业务逻辑都由服务器处理。客户端无法直接知道数据如何被修改。就像其他字段一样,每个模式中的修改都会返回一个类型。如果该类型是对象类型,则可以查询该类型上的字段,以便获取被修改对象的新的状态。
在这个例子中,我们定义了一个名为UpvotePost
的`mutation,它执行模式中的upvotePost(postId:)
mutation。
mutation UpvotePost($postId: Int!) {upvotePost(postId: $postId) {idvotes}}
服务器实现了upvotePost(postId:)
mutation,以向给定postId
的文章添加赞,并返回该文章。上述mutation选择了返回Post
对象的id
和votes
字段。
结果可能如下
{"data": {"upvotePost": {"id": "123","votes": 5}}}
执行修改
与查询类似,mutations由生成的类的实例表示,符合GraphQLMutation
协议。 操作 参数生成,用于定义mutation 变量。有关将参数传递给变异的更多信息,请参阅“操作参数”
您将一个mutation对象传递到ApolloClient.perform(mutation:)
以将mutation发送到服务器,执行它,并接收类型化的结果。
apollo.perform(mutation: UpvotePostMutation(postId: postId)) { result inguard let data = try? result.get().data else { return }print(data.upvotePost?.votes)}
在突变结果中使用片段
在许多情况下,您可能想使用突变结果来更新您的UI。片段可谓在查询和突变之间共享结果处理的绝佳方式:
mutation UpvotePost($postId: Int!) {upvotePost(postId: $postId) {...PostDetails}}
client.perform(mutation: UpvotePostMutation(postId: postId)) { result inguard let data = try? result.get().data else { return }self.configure(with: data.upvotePost?.fragments.postDetails)}
传递输入对象
GraphQL 类型系统 包含 输入对象,这是将复杂值传递到 字段 的一种方式。输入对象通常定义为 突变 变量,因为它们提供了一个紧凑的方式来传递创建对象的输入:
mutation CreateReviewForEpisode($episode: Episode!, $review: ReviewInput!) {createReview(episode: $episode, review: $review) {starscommentary}}
let review = ReviewInput(stars: 5, commentary: "This is a great movie!")apollo.perform(mutation: CreateReviewForEpisodeMutation(episode: .jedi, review: review))
设计突变结果
当人们谈论 GraphQL 时,他们通常会关注数据获取这一方面,因为这是GraphQL带来最大价值的地方。突变 如果做得好,可以相当不错,但设计良好突变(尤其是良好的突变结果类型)的原则在开源社区中尚未得到充分理解。
在 GraphQL 中,突变可以返回任何类型,并且该类型可以像常规 GraphQL 查询一样进行查询。因此,问题是什么类型应该特定突变返回?
在大多数情况下,来自突变结果的数据应该是服务器开发者对客户端需要了解服务器上发生情况的最佳预测。例如,在博客文章上创建新评论的突变可能返回该评论本身。重新排序数组的突变可能需要返回整个数组。