You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
RxSwift: Reactive Programming with Swift | raywenderlich.com
Transforming the response
func fetchEvents(repo:String){letresponse=Observable.from([repo]).map{ urlString ->URLinreturnURL(string:"https://api.github.com/repos/\(urlString)/events")!
}.map{ url ->URLRequestinreturnURLRequest(url: url)}.flatMap{ request ->Observable<(response:HTTPURLResponse, data:Data)>inreturnURLSession.shared.rx.response(request: request)}.share(replay:1)// keep in a buffer the last emitted event
response.filter{ response, _ inreturn200..<300~= response.statusCode
}.compactMap{ _, data ->[Event]?inreturntry?JSONDecoder().decode([Event].self, from: data)}.subscribe(onNext:{[weak self] newEvents inself?.processEvents(newEvents)}).disposed(by: bag)}
Processing the response
privateletevents=BehaviorRelay<[Event]>(value:[])func processEvents(_ newEvents:[Event]){varupdatedEvents= newEvents + events.value
if updatedEvents.count >50{
updatedEvents =[Event](updatedEvents.prefix(upTo:50))// this way you will show only the latest activity}
events.accept(updatedEvents)DispatchQueue.main.async{self.tableView.reloadData()self.refreshControl?.endRefreshing()}}
Add a last-modified header to the request
privateletlastModified=BehaviorRelay<String?>(value:nil)privateletmodifiedFileURL=cachedFileURL("modified.txt")overridefunc viewDidLoad(){
super.viewDidLoad()
if let lastModifiedString =try?String(contentsOf: modifiedFileURL, encoding:.utf8){
lastModified.accept(lastModifiedString)}}func fetchEvents(repo:String){letresponse=Observable.from([repo]).map{ urlString ->URLinreturnURL(string:"https://api.github.com/repos/\(urlString)/events")!
}.map{[weak self] url ->URLRequestinvarrequest=URLRequest(url: url)
if let modifiedHeader =self?.lastModified.value {
request.addValue(modifiedHeader, forHTTPHeaderField:"Last-Modified")}return request
}.flatMap{ request ->Observable<(response:HTTPURLResponse, data:Data)>inreturnURLSession.shared.rx.response(request: request)}.share(replay:1)
response.filter{ response, _ inreturn200..<400~= response.statusCode
}.flatMap{ response, _ ->Observable<String>in
guard let value = response.allHeaderFields["Last-Modified"]as?Stringelse{returnObservable.empty()}returnObservable.just(value)}.subscribe(onNext:{[weak self] modifiedHeader in
guard let self =selfelse{return}self.lastModified.accept(modifiedHeader)try? modifiedHeader.write(to:self.modifiedFileURL, atomically: true, encoding:.utf8)}).disposed(by: bag)}