首页 > 解决方案 > 如何结合这两种异步方法的结果?

问题描述

我有两种方法可以调用。我需要生成一个包含两者结果的模型并调用另一个方法。

我想避免将 1 个方法放在另一个方法中,因为这可能会扩展到 3 或 4 个额外的调用。

基本上,一旦我得到结果setUserFollowedState并且loadFollowersForTopic我想将这两个值发送到另一个函数。

来自我会使用的 JS 领域,async/await但这在 Swift 中不存在。

  func setUserFollowedState() {
    following.load(for: userID, then: { [weak self, topic] result in
      guard self != nil else { return }
      let isFollowed = (try? result.get().contains(topic)) ?? false
      // do something with isFollowed?

    })
  }

  func loadFollowersForTopic() {
    followers.load(topic, then: { [weak self, topic] result in
      guard self != nil else { return }
      let count = (try? result.get().first(where: { $0.tag == topic })?.followers) ?? 0
      // do something with count?
    })
  }

标签: swiftasynchronouscallback

解决方案


您可以将两个异步调用结果存储为可选属性。当您的回调发生时,设置这些属性,然后检查两个属性是否已设置。如果它们已设置,则您知道两个异步调用都已返回。

private var isFollowed: Bool?
private var count: Int?

func setUserFollowedState() {
    following.load(for: userID, then: { [weak self, topic] result in
        guard let self = self else { return }
        let isFollowed = (try? result.get().contains(topic)) ?? false

        self.isFollowed = isFollowed
        performPostAsyncCallFunctionality()
    })
}

func loadFollowersForTopic() {
    followers.load(topic, then: { [weak self, topic] result in
        guard let self = self else { return }
        let count = (try? result.get().first(where: { $0.tag == topic })?.followers) ?? 0

        self.count = count
        performPostAsyncCallFunctionality()
    })
}

private func performPostAsyncCallFunctionality() {
    // Check that both values have been set.
    guard let isFollowed = isFollowed, let count = count else { return }

    // Both calls have returned, do what you need to do.
}

这种方法的好处是您可以使用该模式轻松添加更多异步调用。但是,如果您需要一次进行这么多异步网络调用,我建议您考虑重写服务器端逻辑,这样您只需要一个网络调用即可实现此功能。


推荐阅读