ContexteRxSwift - SCISSION séquence en séquences plus petites à concaténer sur
Je suis en train de mettre en œuvre le téléchargement d'un fichier par morceaux en utilisant l'en-tête Range
.
Objectif
Je souhaite prendre une grande séquence de requêtes HTTP en quatre séquences que je peux ensuite concat pour traiter les demandes de 4 à la fois.
Courant permanent
Je suis actuellement ma séquence et en utilisant concat
pour faire en sorte que la première demande observable est terminée avant que je commence la deuxième. Cela a été fait pour s'assurer que je ne surcharge pas Alamofire avec trop de demandes et que je finisse par avoir des demandes qui expirent.
Idéalement, je voudrais diviser ma séquence en quatre séquences assez égales puisque Alamofire est configuré pour gérer quatre connexions à l'hôte à la fois. Je veux faire cela parce que je crois que cela augmenterait mes vitesses de téléchargement.
Téléchargement du fichier utilisant Chunks
Observable.generate(initialState: 0, condition: { $0 < fileSize }, iterate: {$0 + self.defaultChunkSize})
.map({ (startChunk) in
let endChunk = startChunk + self.defaultChunkSize > fileSize ? fileSize : startChunk + self.defaultChunkSize
return (startChunk, endChunk)
})
.map({ (startChunk: Int, endChunk: Int) -> Observable<FileChunkResult> in
self.filesClient.downloadChunkOf(fileId: file.id, startChunk: Int64(startChunk), endChunk: Int64(endChunk))
})
.concat() // <----- This is where I am forcing the large sequence to do one observable at a time
.flatMap({ (result: FileChunkResult) -> Observable<FileSaveChunkResult> in
switch (result) {
case FileChunkResult.success(let chunkData):
return self.saveChunkToFile(fileChunk: chunkData, location: urlToSaveTo)
case FileChunkResult.failure: // Maybe change this to just default and return Observable.just(FileSaveChunkResult.failure)
break
case FileChunkResult.parserError:
break
}
return Observable.just(FileSaveChunkResult.failure)
})
.flatMap({ (result: FileSaveChunkResult) -> Observable<Progress> in
switch (result) {
case FileSaveChunkResult.success(let bytesSaved):
progress.completedUnitCount += bytesSaved
case FileSaveChunkResult.failure:
break
}
return Observable.just(progress)
})
Juste un FYI. (1) Il n'y a rien dans AlamoFire qui vous limite à quatre demandes à la fois, bien qu'il y ait quelque chose au sujet de votre serveur qui cause une telle restriction. (2) Il est peu probable que quatre demandes de téléchargement en parallèle à une vitesse maximale de 1/4 se terminent chacune plus rapidement que quatre demandes de téléchargement séquentiel à pleine vitesse chacune. –