【发布时间】:2017-04-17 17:20:49
【问题描述】:
目标
我正在尝试实现一个使用 Range 标头下载文件的服务。这允许我一次下载一大块文件。
实现 - Observable.generate()
为了为每个请求创建一个 observable 并保存我尝试使用的文件:
let downloadObservable = Observable.generate(initialState: 0, condition: { $0 < fileSize }, iterate: { $0 + self.defaultChunkSize })
这似乎工作得很好!除了较大的文件,它似乎有一个错误。我的请求被取消了。调试后,我发现我的工作流程并没有按照我的预期工作。这是附加到上一行的其余工作流程。
.map( { (startChunk) -> (Int64, Int64) in
// I determine the end chunk so I can download any size file in chunks of size X
let endChunk = (startChunk + self.defaultChunkSize > fileSize ? fileSize : startChunk + self.defaultChunkSize )
return (startChunk, endChunk)
}).flatMap( { [unowned self] (startChunk: Int64, endChunk: Int64) -> Observable<FileChunk> in
// I make the request via alamofire - UNEXPECTED FLOW HERE SEE NOTE #1
return self.makeChunkRequest(url: downloadUrl, startChunk: startChunk, endChunk: endChunk)
}).flatMap( { [unowned self] (fileChunk: FileChunk) -> Observable<FileSaveChunkResult> in
// Upon receiving chunk response save to file
return self.saveChunkToFile(fileChunk: fileChunk, location: localDestinationUrl)
}).flatMap( { (saveResult: FileSaveChunkResult) -> Observable<Progress> in
// Update progress if successful
switch (saveResult) {
case .success(let bytesSaved):
progress.completedUnitCount += bytesSaved
case .failure:
break
}
return Observable.just(progress)
})
注意 #1
当我运行和调试它时,我的第一个 flatMap 循环直到发出 ALL 块请求。我希望这会更加连续,我们将生成一个 observable,然后通过 flatMap 进行所有转换,然后循环回到开头。
这不是我应该如何实施的吗?
我需要对我的Observable.generate() 上的merge() 施展魔法吗?
【问题讨论】:
-
这个问题的答案花了一点时间,但我找到了!
标签: ios swift reactive-programming observable rx-swift