RxSwift:将可观察的延迟到另一个可观察的完成之前?

时间:2019-02-01 15:54:22

标签: swift reactive-programming rx-swift

我从服务器加载了帖子,并希望全部加载时仅显示。 这是我正在尝试做的事情:

postsRepository
    .fetchPosts()
    .flatMap { posts -> Observable<[Post]> in
        return Observable.merge(posts.map({ /* Code that returns Observable<UIImage> */ }))
            .takeLast(1)
            .map { _ in posts }
    }

但是,上面的这段代码两次加载图像:一次获取所有帖子,一次将帖子绑定到表格视图。该如何处理?

1 个答案:

答案 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中提到的那样,这里的神奇之处在于使用PostimageURL: 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,等待它们全部完成,然后发出一个事件,其中包含所有收集的值的数组。 (此后,每次更新其中一项时,它将发出一个新数组,但这与此处无关。)