簡體   English   中英

如何在 RxSwift 中組合多個 Observable

[英]How to combine multi Observable in RxSwift

假設我為每個圖像下載創建了一個 Observable

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

我怎樣才能:

  • 創建一個新的 Observable 以在下載完成時發出事件
  • 創建一個新的 Observable 以在所有下載完成時僅發出完成的事件

謝謝!

創建一個新的 Observable 以在下載完成時發出事件

查看方法imageObservable以獲得可能的實現。

創建一個新的 Observable 以在所有下載完成時僅發出完成的事件

zip文檔)運算符可能正是您要找的。

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()
        }
    }
}

這個答案可能也與您有關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM