我有以下函数loadData,我想在refreshable的SwiftUI列表中使用它。为此,我需要使它成为一个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?
发布于 2021-12-30 15:59:52
每个组合发布服务器都有一个values属性,它是一个异步序列:
https://developer.apple.com/documentation/combine/publisher/values-1dm9r
因此,任何以发行者开头的管道都可以被async/await代码替换,使用async for循环捕获async。因此,如果您愿意,您可以继续使用您的followersPublisher和followingPublisher,只需使用async/await而不是组合订阅。
另一方面,取决于这些发布者所做的事情,您可能希望进一步追溯这条链,并摆脱这些发布者,用您可以从async上下文中调用的async/await方法来替换它们。
https://stackoverflow.com/questions/70533831
复制相似问题