Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save darrensapalo/c3a97d4d7a64c9accf243c2db0552a2f to your computer and use it in GitHub Desktop.
Save darrensapalo/c3a97d4d7a64c9accf243c2db0552a2f to your computer and use it in GitHub Desktop.
Separate your code to make it more readable. It makes it easier to debug as well.
import RxSwift
example ("Helping Sebastian Roth") {
let disposeBag = DisposeBag()
// Data model representing the current download progress
struct DownloadProgress {
var numberOfCompletedDownloads: Int
var progress: Float
func increaseProgress(progress: Float) -> DownloadProgress {
return DownloadProgress(numberOfCompletedDownloads: self.numberOfCompletedDownloads, progress: progress)
}
func downloadComplete() -> DownloadProgress {
return DownloadProgress(numberOfCompletedDownloads: self.numberOfCompletedDownloads + 1, progress: 0)
}
}
// Desired data model
class Video {
var name = "Video name"
var url = "http://www.google.com"
var data: String! = ""
}
// Constants, based on what is to be downloaded
let paths = ["url1", "url2", "url3"]
let numberOfDownloads = paths.count
let percentPerItem : Float = Float(1) / Float(numberOfDownloads)
let progressTracker = Variable<DownloadProgress>(DownloadProgress(numberOfCompletedDownloads: 0, progress: 0))
/**
Returns the total progress over all the downloads.
*/
func computeTotalProgress(currentProgress: DownloadProgress) -> Float {
return Float(currentProgress.numberOfCompletedDownloads) * percentPerItem + currentProgress.progress * percentPerItem
}
/**
Observable that handles updating the UI whenever progress changes
*/
progressTracker
.asObservable()
.map(computeTotalProgress)
.subscribe(onNext: { currentTotalProgress in
// Set progress bar value
print("Progress at: \(currentTotalProgress)")
})
.addDisposableTo(disposeBag)
/**
Code to perform a download using Alamofire, given a URL.
*/
func downloadVideo (url url: String, index: Int) -> Observable<Video> {
return Observable.create { obx in
// Perform an alamofire network call
// ... Alamofire triggering the progress tracker whenever
Array(0..<100).map { Float($0) / 100 }.forEach { p in
// Increase progress whenever needed
progressTracker.value = progressTracker.value.increaseProgress(progress: p)
}
// Emit video when finished
let result = Video()
result.url = url
obx.onNext(result)
// Mark download as finished
progressTracker.value = progressTracker.value.downloadComplete()
obx.onCompleted()
return Disposables.create()
}
}
func oneDownloadComplete(video: Video) {
print("One download done: \(video.url)")
}
func downloadComplete () {
print("Download complete")
}
Observable
.from(paths)
.flatMapWithIndex(downloadVideo)
.subscribe (onNext: oneDownloadComplete, onCompleted: downloadComplete)
.addDisposableTo(disposeBag)
}
// -- output --
--- Helping Sebastian Roth example ---
Progress at: 0.0
Progress at: 0.0
Progress at: 0.00333333
Progress at: 0.00666667
Progress at: 0.01
Progress at: 0.0133333
Progress at: 0.0166667
Progress at: 0.02
Progress at: 0.0233333
Progress at: 0.0266667
Progress at: 0.03
Progress at: 0.0333333
Progress at: 0.0366667
Progress at: 0.04
Progress at: 0.0433333
Progress at: 0.0466667
Progress at: 0.05
Progress at: 0.0533333
Progress at: 0.0566667
Progress at: 0.06
Progress at: 0.0633333
Progress at: 0.0666667
Progress at: 0.07
Progress at: 0.0733333
Progress at: 0.0766667
Progress at: 0.08
Progress at: 0.0833333
Progress at: 0.0866667
Progress at: 0.09
Progress at: 0.0933333
Progress at: 0.0966667
Progress at: 0.1
Progress at: 0.103333
Progress at: 0.106667
Progress at: 0.11
Progress at: 0.113333
Progress at: 0.116667
Progress at: 0.12
Progress at: 0.123333
Progress at: 0.126667
Progress at: 0.13
Progress at: 0.133333
Progress at: 0.136667
Progress at: 0.14
Progress at: 0.143333
Progress at: 0.146667
Progress at: 0.15
Progress at: 0.153333
Progress at: 0.156667
Progress at: 0.16
Progress at: 0.163333
Progress at: 0.166667
Progress at: 0.17
Progress at: 0.173333
Progress at: 0.176667
Progress at: 0.18
Progress at: 0.183333
Progress at: 0.186667
Progress at: 0.19
Progress at: 0.193333
Progress at: 0.196667
Progress at: 0.2
Progress at: 0.203333
Progress at: 0.206667
Progress at: 0.21
Progress at: 0.213333
Progress at: 0.216667
Progress at: 0.22
Progress at: 0.223333
Progress at: 0.226667
Progress at: 0.23
Progress at: 0.233333
Progress at: 0.236667
Progress at: 0.24
Progress at: 0.243333
Progress at: 0.246667
Progress at: 0.25
Progress at: 0.253333
Progress at: 0.256667
Progress at: 0.26
Progress at: 0.263333
Progress at: 0.266667
Progress at: 0.27
Progress at: 0.273333
Progress at: 0.276667
Progress at: 0.28
Progress at: 0.283333
Progress at: 0.286667
Progress at: 0.29
Progress at: 0.293333
Progress at: 0.296667
Progress at: 0.3
Progress at: 0.303333
Progress at: 0.306667
Progress at: 0.31
Progress at: 0.313333
Progress at: 0.316667
Progress at: 0.32
Progress at: 0.323333
Progress at: 0.326667
Progress at: 0.33
One download done: url1
Progress at: 0.333333
Progress at: 0.333333
Progress at: 0.336667
Progress at: 0.34
Progress at: 0.343333
Progress at: 0.346667
Progress at: 0.35
Progress at: 0.353333
Progress at: 0.356667
Progress at: 0.36
Progress at: 0.363333
Progress at: 0.366667
Progress at: 0.37
Progress at: 0.373333
Progress at: 0.376667
Progress at: 0.38
Progress at: 0.383333
Progress at: 0.386667
Progress at: 0.39
Progress at: 0.393333
Progress at: 0.396667
Progress at: 0.4
Progress at: 0.403333
Progress at: 0.406667
Progress at: 0.41
Progress at: 0.413333
Progress at: 0.416667
Progress at: 0.42
Progress at: 0.423333
Progress at: 0.426667
Progress at: 0.43
Progress at: 0.433333
Progress at: 0.436667
Progress at: 0.44
Progress at: 0.443333
Progress at: 0.446667
Progress at: 0.45
Progress at: 0.453333
Progress at: 0.456667
Progress at: 0.46
Progress at: 0.463333
Progress at: 0.466667
Progress at: 0.47
Progress at: 0.473333
Progress at: 0.476667
Progress at: 0.48
Progress at: 0.483333
Progress at: 0.486667
Progress at: 0.49
Progress at: 0.493333
Progress at: 0.496667
Progress at: 0.5
Progress at: 0.503333
Progress at: 0.506667
Progress at: 0.51
Progress at: 0.513333
Progress at: 0.516667
Progress at: 0.52
Progress at: 0.523333
Progress at: 0.526667
Progress at: 0.53
Progress at: 0.533333
Progress at: 0.536667
Progress at: 0.54
Progress at: 0.543333
Progress at: 0.546667
Progress at: 0.55
Progress at: 0.553333
Progress at: 0.556667
Progress at: 0.56
Progress at: 0.563333
Progress at: 0.566667
Progress at: 0.57
Progress at: 0.573333
Progress at: 0.576667
Progress at: 0.58
Progress at: 0.583333
Progress at: 0.586667
Progress at: 0.59
Progress at: 0.593333
Progress at: 0.596667
Progress at: 0.6
Progress at: 0.603333
Progress at: 0.606667
Progress at: 0.61
Progress at: 0.613333
Progress at: 0.616667
Progress at: 0.62
Progress at: 0.623333
Progress at: 0.626667
Progress at: 0.63
Progress at: 0.633333
Progress at: 0.636667
Progress at: 0.64
Progress at: 0.643333
Progress at: 0.646667
Progress at: 0.65
Progress at: 0.653333
Progress at: 0.656667
Progress at: 0.66
Progress at: 0.663333
One download done: url2
Progress at: 0.666667
Progress at: 0.666667
Progress at: 0.67
Progress at: 0.673333
Progress at: 0.676667
Progress at: 0.68
Progress at: 0.683333
Progress at: 0.686667
Progress at: 0.69
Progress at: 0.693333
Progress at: 0.696667
Progress at: 0.7
Progress at: 0.703333
Progress at: 0.706667
Progress at: 0.71
Progress at: 0.713333
Progress at: 0.716667
Progress at: 0.72
Progress at: 0.723333
Progress at: 0.726667
Progress at: 0.73
Progress at: 0.733333
Progress at: 0.736667
Progress at: 0.74
Progress at: 0.743333
Progress at: 0.746667
Progress at: 0.75
Progress at: 0.753333
Progress at: 0.756667
Progress at: 0.76
Progress at: 0.763333
Progress at: 0.766667
Progress at: 0.77
Progress at: 0.773333
Progress at: 0.776667
Progress at: 0.78
Progress at: 0.783333
Progress at: 0.786667
Progress at: 0.79
Progress at: 0.793333
Progress at: 0.796667
Progress at: 0.8
Progress at: 0.803333
Progress at: 0.806667
Progress at: 0.81
Progress at: 0.813333
Progress at: 0.816667
Progress at: 0.82
Progress at: 0.823333
Progress at: 0.826667
Progress at: 0.83
Progress at: 0.833333
Progress at: 0.836667
Progress at: 0.84
Progress at: 0.843333
Progress at: 0.846667
Progress at: 0.85
Progress at: 0.853333
Progress at: 0.856667
Progress at: 0.86
Progress at: 0.863333
Progress at: 0.866667
Progress at: 0.87
Progress at: 0.873333
Progress at: 0.876667
Progress at: 0.88
Progress at: 0.883333
Progress at: 0.886667
Progress at: 0.89
Progress at: 0.893333
Progress at: 0.896667
Progress at: 0.9
Progress at: 0.903333
Progress at: 0.906667
Progress at: 0.91
Progress at: 0.913333
Progress at: 0.916667
Progress at: 0.92
Progress at: 0.923333
Progress at: 0.926667
Progress at: 0.93
Progress at: 0.933333
Progress at: 0.936667
Progress at: 0.94
Progress at: 0.943333
Progress at: 0.946667
Progress at: 0.95
Progress at: 0.953333
Progress at: 0.956667
Progress at: 0.96
Progress at: 0.963333
Progress at: 0.966667
Progress at: 0.97
Progress at: 0.973333
Progress at: 0.976667
Progress at: 0.98
Progress at: 0.983333
Progress at: 0.986667
Progress at: 0.99
Progress at: 0.993333
Progress at: 0.996667
One download done: url3
Progress at: 1.0
Download complete
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment