将具有 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
。因此,如果您愿意,可以继续使用 followersPublisher
和 followingPublisher
并使用 async/await
而不是 Combine.
订阅它们。
另一方面,根据这些发布者的行为,您可能希望进一步追踪此链并摆脱这些发布者并用 async
方法替换它们,您可以从 [=11] 中调用这些方法=]上下文。
我有以下函数 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
。因此,如果您愿意,可以继续使用 followersPublisher
和 followingPublisher
并使用 async/await
而不是 Combine.
另一方面,根据这些发布者的行为,您可能希望进一步追踪此链并摆脱这些发布者并用 async
方法替换它们,您可以从 [=11] 中调用这些方法=]上下文。