假设我为每个图像下载创建一个 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/