- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
链接 AnyPublisher 的典型方法是使用 Combine 运算符,例如 flatMap。
class MyService {
func getUserList() -> AnyPublisher<[User], Error> {
....
}
func getPostList(user: User) -> AnyPublisher<[Post], Error> {
...
}
}
class ViewModel: ObserableObject {
let service = MyService()
@published var post: [Post] = []
func fetchAllPostFromLastUser() {
service.getUserList().flatMap { [weak self] users in
if let user = users.last {
return self.service.getPosts(user: user)
} else {
return Fail(error:APIError.emptyUsers).eraseToAnyPublisher()
}
}
.sink { result in
}
}
}
有没有更优雅的方法来使用async/await,所以代码可以类似
class ViewModel: ObserableObject {
let service = MyService()
@published var post: [Post] = []
func fetchAllPostFromLastUser() {
let users = await service.getUserList().somethingMagicToConvertPublisherToAsync()
let posts = await service.getPostList(user: user.first).somethingMagicToConvertPublisherToAsync()
}
}
最佳答案
要使用 async/await
,我们需要将 Publisher
转换为值的 AsyncStream
,从而消除错误。
所以,有可能像(用 Xcode 13.4 测试过)
@MainActor class ViewModel: ObserableObject {
// ...
func collectPosts() async {
for await newUsers in service.getUserList().replaceError(with: []).values {
for user in newUsers {
for await newPost in service.getPost(user: user).replaceError(with: []).values {
post.append(contentsOf: newPost)
}
}
}
}
和用法类似
struct ContentView: View {
@StateObject var vm = ViewModel()
var body: some View {
YourViewHere()
.task {
await vm.collectPosts()
}
}
}
关于swiftui - 如何在 SwiftUI 中使用 async/await 链接 AnyPublisher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72609975/
我从 RESTful 服务器加载端点,其中一些端点是多页的。它们由 header 响应中的“x-pages”字段表示。我想创建一个发布者,它将所有页面中的所有对象作为单个数组返回。 最后一个 retu
如何将数组某个元素的发布者转换为所述元素的发布者(但有更多事件)? 例如我怎样才能转换 AnyPublisher至AnyPublisher ? 我想也许 RxSwift 用它的 from operat
我将异步请求包装在 Combine 发布者中,以便它们可以轻松地跨不同管道使用。 消费者可能会按以下方式保留这些发布者: struct Dependencies { var loadImageRe
func testData()->AnyPublisher { var data = DummyData().decodeClaimDetails()! return (Jus
我只是在学习如何使用Combine。我有使用 Rx(RxSwift 和 RxJava)的经验,我注意到它非常相似。 然而,完全不同的一件事(而且有点烦人)是 Publisher协议(protocol)
AnyPublisher 在 Combine 中的作用是什么,以及为什么在许多示例中,包括在 WWDC Combine In practice, 27:40 中他们返回 AnyPublisher,使用
如何转换 Just至AnyPublisher .当我使用 eraseToAnyPublisher()类型为 AnyPublisher这与 AnyPublisher 不同 例如,我有一个简单的函数,我想
我考虑一下有什么区别 @Published var isLoggedIn: Bool = false var isLoggedIn: AnyPublisher 我知道在第一种情况下,我可以直接在 Sw
链接 AnyPublisher 的典型方法是使用 Combine 运算符,例如 flatMap。 class MyService { func getUserList() -> AnyPubl
我是一名优秀的程序员,十分优秀!