gpt4 book ai didi

ios - Swift 中使用 Apollo 的自动 UI 更新不起作用

转载 作者:可可西里 更新时间:2023-11-01 00:41:41 37 4
gpt4 key购买 nike

我有一个小型 Apollo iOS 应用程序的以下设置,我在 TableView 中显示了一个 session 列表,并希望能够将一个 session 添加到列表:

GraphQL:

query AllConferences {
allConferences {
...ConferenceDetails
}
}

mutation CreateConference($name: String!, $city: String!, $year: String!) {
createConference(name: $name, city: $city, year: $year) {
...ConferenceDetails
}
}

fragment ConferenceDetails on Conference {
id
name
city
year
attendees {
...AttendeeDetails
}
}

fragment AttendeeDetails on Attendee {
id
name
conferences {
id
}
}

session TableView Controller :

class ConferencesTableViewController: UITableViewController {

var allConferencesWatcher: GraphQLQueryWatcher<AllConferencesQuery>?

var conferences: [ConferenceDetails] = [] {
didSet {
tableView.reloadData()
}
}

deinit {
allConferencesWatcher?.cancel()
}

override func viewDidLoad() {
super.viewDidLoad()

allConferencesWatcher = apollo.watch(query: AllConferencesQuery()) { result, error in
print("Updating conferences: ", result?.data?.allConferences)
guard let conferences = result?.data?.allConferences else {
return
}
self.conferences = conferences.map { $0.fragments.conferenceDetails }
}
}

// ...
// standard implementation of UITableViewDelegate
// ...

}

添加 session View Controller :

class AddConferenceViewController: UIViewController {

// ... IBOutlets

@IBAction func saveButtonPressed() {
let name = nameTextField.text!
let city = cityTextField.text!
let year = yearTextField.text!

apollo.perform(mutation: CreateConferenceMutation(name: name, city: city, year: year)) { result, error in
if let _ = result?.data?.createConference {
self.presentingViewController?.dismiss(animated: true)
}
}

}
}

我还在 AppDelegate 中实现了 cacheKeyForObject,如下所示:

apollo.cacheKeyForObject = { $0["id"] }

我的问题是是否可以通过此设置从自动 UI 更新中获益?当前,当执行 CreateConferenceMutation 时, TableView 不会更新。我是不是遗漏了什么,还是遇到了 docs 中提到的限制? :

In some cases, just using cacheKeyFromObject is not enough for your application UI to update correctly. For example, if you want to add something to a list of objects without refetching the entire list, or if there are some objects that to which you can’t assign an object identifier, Apollo cannot automatically update existing queries for you.

最佳答案

这确实是自动 UI 更新的一个限制。尽管 Apollo 使用 cacheKeyFromObject 通过 ID 匹配对象,并且涵盖了许多常见情况,但它无法自动更新对象列表。

在您的架构中,Apollo 无法知道应将新添加的 session 添加到 allConferences 列表中。它只知道 allConferences 返回一个 session 对象列表,但这些对象可以任意选择和排序。

所以在这种情况下,您将不得不自己从服务器重新获取查询,或者更改变异结果以包含更新后的列表。

另一种选择是手动将新 session 添加到客户端存储的列表中。为此,下一个版本的 Apollo iOS 将包含一个手动更新选项,类似于 Apollo JavaScript 客户端中的 updateQueries

关于ios - Swift 中使用 Apollo 的自动 UI 更新不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42737396/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com