将具有 publishers/sinks 组合的函数转换为异步函数

Turning function that has a combination of publishers/sinks into an async function

我有以下函数 loadData,我想在 SwiftUI 列表的 refreshable 中使用它。为此,我需要将其设为 async 函数:

func loadData() {
  // Publishers
  let followersPublisher = modelLoader.loadAllFollowers(withId: id)
  let followingPublisher = modelLoader.loadAllFollowing(withId: id)
  let friendshipsPublisher = Publishers.Zip(followersPublisher, followingPublisher)
    .share()
    .eraseToAnyPublisher()

  // Sinks
  getFollowers(from: followersPublisher)
  getFollowerChange(
    from: followersPublisher,
    cachedFollowers: followers
  )
  getFollowing(from: followingPublisher)
  getNotFollowingUserBack(from: friendshipsPublisher)
  getUserNotFollowing(from: friendshipsPublisher)

  followersPublisher
    .connect()
    .store(in: &cancellables)
  followingPublisher
    .connect()
    .store(in: &cancellables)
}

在此函数中,所有单独的函数都使用 Publisher 接收器。例如:

private func getFollowing(from publisher: Publishers.MakeConnectable<AnyPublisher<Set<User>, Never>>) {
  publisher
    .sink(
      receiveCompletion: { _ in },
      receiveValue: { [weak self] following in
        self?.following = following
      }
    )
    .store(in: &cancellables)
}

我怎样才能把它变成一个 async 函数,这样我就可以使用 await 了?

每个 Combine Publisher 都有一个 values 属性 是一个异步序列:

https://developer.apple.com/documentation/combine/publisher/values-1dm9r

因此,任何以 Publisher 开头的管道都可以用 async/await 代码替换,使用 async for 循环捕获 values。因此,如果您愿意,可以继续使用 followersPublisherfollowingPublisher 并使用 async/await 而不是 Combine.

订阅它们。

另一方面,根据这些发布者的行为,您可能希望进一步追踪此链并摆脱这些发布者并用 async 方法替换它们,您可以从 [=11] 中调用这些方法=]上下文。