Я все еще новичок в реактивном программировании и RxSwift в целом. Я хочу связать две разные операции. В моем случае я просто хочу загрузить zip-файл с веб-сервера, а затем распаковать его локально. Я также хочу, заодно, показать прогресс скачанных файлов. Итак, я начал создавать первую наблюдаемую:
class func rx_download(req:URLRequestConvertible, testId:String) -> Observable<Float> {
let destination:Request.DownloadFileDestination = ...
let obs:Observable<Float> = Observable.create { observer in
let request = Alamofire.download(req, destination: destination)
request.progress { _, totalBytesWritten, totalBytesExpectedToWrite in
if totalBytesExpectedToWrite > 0 {
observer.onNext(Float(totalBytesWritten) / Float(totalBytesExpectedToWrite))
}
else {
observer.onNext(0)
}
}
request.response { _, response, _, error in
if let responseURL = response {
if responseURL.statusCode == 200 {
observer.onNext(1.0)
observer.onCompleted()
} else {
let error = NSError(domain: "error", code: responseURL.statusCode, userInfo: nil)
observer.onError(error)
}
} else {
let error = NSError(domain: "error", code: 500, userInfo: nil)
observer.onError(error)
}
}
return AnonymousDisposable () {
request.cancel()
}
}
return obs.retry(3)
}
После этого создаю аналогичную функцию для распаковки
class func rx_unzip(testId:String) -> Observable<Float> {
return Observable.create { observer in
do {
try Zip.unzipFile(NSURL.archivePath(testId), destination: NSURL.resourceDirectory(testId), overwrite: true, password: nil)
{progress in
observer.onNext(Float(progress))
}
} catch let error {
observer.onError(error)
}
observer.onCompleted()
return NopDisposable.instance
}
}
На данный момент у меня есть эта логика на уровне «Просмотр модели», поэтому я загружаю-> подписываюсь на завершение-> разархивирую
Я хочу объединить два Observable в один, чтобы сначала выполнить загрузку, а затем по завершении распаковать файл. Есть какой-либо способ сделать это?