2

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

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
  }
}

会议表视图控制器

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
  // ...

}

添加会议视图控制器

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)
      }
    }

  }
}

我也在cacheKeyForObjectAppDelegate 中这样实现:

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

我的问题是是否可以通过此设置从自动 UI 更新中受益?当前CreateConferenceMutation执行时,表视图不会更新。我是否遗漏了什么,或者我是否达到了文档中提到的限制:

在某些情况下,仅仅使用cacheKeyFromObject还不足以让您的应用程序 UI 正确更新。例如,如果您想在不重新获取整个列表的情况下将某些内容添加到对象列表中,或者如果您无法为某些对象分配对象标识符,则 Apollo 无法自动为您更新现有查询。

4

1 回答 1

4

这确实是自动 UI 更新的限制。虽然 Apollo 使用cacheKeyFromObjectID 来匹配对象,并且这涵盖了许多常见的情况,但它不能自动更新对象列表。

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

因此,在这种情况下,您必须自己从服务器重新获取查询,或者更改突变结果以包含更新的列表。

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

于 2017-03-12T07:03:23.663 回答