如何在RxSwift中组合多个观测值
假设我为每个下载的图像创建一个可观察的对象如何在RxSwift中组合多个观测值,swift,rx-swift,reactive,Swift,Rx Swift,Reactive,假设我为每个下载的图像创建一个可观察的对象 for _ in 0...N { let s : Single<UIImage?> = fetchImage(from url) } 0…N中的uu的{ 设s:Single=fetchImage(从url) } 我怎样才能: 创建一个新的可观察对象,以便在下载完成时发出事件 创建一个新的Observable,以便在所有下载完成时仅发出completed事件 谢谢 创建一个新的可观察对象,以便在下载完成时发出事件 查看方法im
for _ in 0...N {
let s : Single<UIImage?> = fetchImage(from url)
}
0…N中的uu的{
设s:Single=fetchImage(从url)
}
我怎样才能:
- 创建一个新的可观察对象,以便在下载完成时发出事件
- 创建一个新的Observable,以便在所有下载完成时仅发出completed事件
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()
}
}
}
导入RxSwift
导入UIKit
枚举自定义错误:错误{
案例错误
}
类执行器{
设disposeBag=disposeBag()
func execute(){
设ImageURL=[
URL(字符串):http://via.placeholder.com/350x150")!,
URL(字符串):http://via.placeholder.com/350x150")!
]
让imageObservables=imageURLs.map{self.imageObservables(url:$0)}
可观察
.zip(imageObservables)//等待所有图像请求完成
.subscribe(onNext:{images in)
//这里有“图像”数组中的每个图像
images.forEach{print($0)}
})
.处置(由:处置人)
}
//将“URLSession”数据任务包装到可观察的
func imageObservable(url:url)->Observable{
返回可观察的。在中创建{observer
URLSession
.共享
.dataTask(带有:url,completionHandler:{(数据,响应,错误)->中的Void
如果let error=error{
observer.onError(错误)
返回
}
保护let data=data,let image=UIImage(data:data)else{
observer.onError(CustomError.someError)
返回
}
observer.onNext(图片)
observer.onCompleted()
})
1.简历()
返回一次性物品。创建()
}
}
}
这可能也与您有关。这正是我要找的。非常感谢。或者使用CombineTest Combine Latest,当您的所有观察对象都具有相同类型的元素时,它非常好。如果需要按顺序执行,事情就会变得复杂。