我从服务器加载了帖子,并希望全部加载时仅显示。 这是我正在尝试做的事情:
postsRepository
.fetchPosts()
.flatMap { posts -> Observable<[Post]> in
return Observable.merge(posts.map({ /* Code that returns Observable<UIImage> */ }))
.takeLast(1)
.map { _ in posts }
}
但是,上面的这段代码两次加载图像:一次获取所有帖子,一次将帖子绑定到表格视图。该如何处理?
答案 0 :(得分:1)
这是一个有趣的...
1
如果您愿意使用0
,则不一定严格要求最后一个1.0
。
以上假设seriesCap = 1.0/(1.0/c1 + 1.0/c2 + 1.0/c3);
具有let postsWithImages = postsRepository
.fetchPosts()
.flatMap { posts in
Observable.combineLatest(
posts
.map { $0.imageURL }
.map { URLSession.shared.rx.data(request: URLRequest(url: $0))
.map { UIImage(data: $0) }
.catchErrorJustReturn(nil)
}
)
.map { zip(posts, $0) }
}
.map { $0.map { (post: $0.0, image: $0.1) } }
属性。
让我们清理一下:
map
上面需要一个新功能:
Zip2Sequence
我想我会添加一些解释。正如我在文章Recipes for Combining Observables in RxSwift中提到的那样,这里的神奇之处在于使用Post
将imageURL: URL
转换为let postsWithImages = postsRepository
.fetchPosts()
.flatMap { posts in
Observable.combineLatest(
posts
.map { $0.imageURL }
.map { URLSession.shared.rx.image(for: $0) }
)
.map { zip(posts, $0) }
}
.map { $0.map { (post: $0.0, image: $0.1) } }
。
运算符获取Observable数组,订阅所有Observable,等待它们全部完成,然后发出一个事件,其中包含所有收集的值的数组。 (此后,每次更新其中一项时,它将发出一个新数组,但这与此处无关。)