如何在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,当您的所有观察对象都具有相同类型的元素时,它非常好。如果需要按顺序执行,事情就会变得复杂。