Hi,
The solution for chapter 12’s challenge is:
let textSearch = searchCityName.rx.controlEvent(.editingDidEndOnExit).asObservable()
let temperature = tempSwitch.rx.controlEvent(.valueChanged).asObservable()
let search = Observable.from([textSearch, temperature])
.merge()
.map { self.searchCityName.text }
.filter { ($0 ?? "").characters.count > 0 }
.flatMap { text in
return ApiController.shared.currentWeather(city: text ?? "Error")
.catchErrorJustReturn(ApiController.Weather.empty)
}.asDriver(onErrorJustReturn: ApiController.Weather.empty)
search.map { w in
if self.tempSwitch.isOn {
return "\(Int(Double(w.temperature) * 1.8 + 32))° F"
}
return "\(w.temperature)° C"
}
.drive(tempLabel.rx.text)
.addDisposableTo(bag)
Though it works, I find it bothering that every time the switch is flipped, a new (useless) request is made to the API.
One solution I found is:
let textSearch = searchCityName.rx.controlEvent(.editingDidEndOnExit).asObservable()
let temperature = tempSwitch.rx.controlEvent(.valueChanged).asObservable()
let search = textSearch
.map { self.searchCityName.text }
.filter { ($0 ?? "").characters.count > 0 }
.flatMapLatest { text in
return ApiController.shared.currentWeather(city: text ?? "Error")
}
let searchDrive = search.asDriver(onErrorJustReturn: ApiController.Weather.empty)
Observable.combineLatest(search, temperature) { $0.0 }
.map { w in
if self.tempSwitch.isOn {
return "\(w.temperature)° C"
} else {
return "\(Int(Double(w.temperature) * 1.8 + 32))° F"
}
}
.bind(to: tempLabel.rx.text)
.addDisposableTo(bag)
It works well but I’m losing the niceties of using a Driver for the temperature label.
I’d love some insights on how to solve that challenge using only Drivers and not doing extraneous api requests.
Thanks,