swift - 如何在 RxSwift 中组合多个 Observable

标签 swift rx-swift reactive

假设我为每个图像下载创建一个 Observable

for _ in 0...N {
    let s : Single<UIImage?> = fetchImage(from url)
}

我怎样才能:

  • 创建一个新的 Observable 以在下载完成时发出事件
  • 创建一个新的 Observable,以便在所有下载完成时仅发出已完成事件

谢谢!

最佳答案

create a new Observable to emit an event when a download is completed

查看方法imageObservable以了解可能的实现。

create a new Observable to emit only completed event when all download is completed

zip ( documentation ) 运算符可能就是您正在寻找的内容。

import RxSwift
import UIKit

enum CustomError: Error {
    case someError
}

class Executer {

    let disposeBag = DisposeBag()

    func execute() {
        let imageURLs = [
            URL(string: "http://via.placeholder.com/350x150")!, 
            URL(string: "http://via.placeholder.com/350x150")!
        ]
        let imageObservables = imageURLs.map { self.imageObservable(url: $0) }
        Observable
            .zip(imageObservables) // wait for all image requests to finish
            .subscribe(onNext: { images in
                // here you have every single image in the 'images' array
                images.forEach { print($0) }
            })
            .disposed(by: disposeBag)
     }

     // wrap 'URLSession' datatask into an observable
     func imageObservable(url: URL) -> Observable<UIImage> {
        return Observable.create { observer in
            URLSession
                .shared
                .dataTask(with: url, completionHandler: { (data, response, error) -> Void in
                    if let error = error {
                        observer.onError(error)
                        return
                    }
                    guard let data = data, let image = UIImage(data: data) else {
                        observer.onError(CustomError.someError)
                        return
                    }
                    observer.onNext(image)
                    observer.onCompleted()
                })
                .resume()
            return Disposables.create()
        }
    }
}

这个answer可能也与您相关。

关于swift - 如何在 RxSwift 中组合多个 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49859936/

相关文章:

ios - 在模拟器上运行应用程序时,它崩溃并提示 thread 1 : breakpoint 3. 1. 我该怎么办?

ios - RxSwift - 在 UISearchBar 中以编程方式触发搜索

swift - AWS S3 签名的 UploadPart header 的 Content-MD5

swift - 如何在包含 Objective-C 代码的项目中使用 RxSwift?

ios - 基于Notification有效负载快速显示Viewcontroller

java - 响应式(Reactive) Redis 主题中发布的消息不会发送到客户端

java - 如何使用 Spring Boot 单独访问作为 Mono 对象返回的属性

r - Shiny 允许用户选择要显示的绘图输出

ios - Firebase 有时会崩溃,但并非总是如此

ios - 为什么 UICollectionView 的委托(delegate)方法不起作用?