С помощью RxSwift цель моего проекта - всякий раз, когда пользователь набирает город в строке поиска, он будет звонить, чтобы обернуть текущую температуру. В настоящее время, у меня есть viewModel
, который содержитonCompleted никогда не набирается
var searchingTerm = Variable<String>("") // this will be binded to search text from view controller
var result: Observable<Weather>! // this Observable will emit the result based on searchingTerm above.
В апи службе, я оборачивать сетевой вызов, используя RxSwift следуя
func openWeatherMapBy(city: String) -> Observable<Weather> {
let url = NSURL(string: resourceURL.forecast.path.stringByReplacingOccurrencesOfString("EnterYourCity", withString: city))
return Observable<WeatherModel>.create({ observer -> Disposable in
let downloadTask = self.session.dataTaskWithURL(url!, completionHandler: { (data, response, error) in
if let err = error {
observer.onError(err)
}
else {
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as! [String: AnyObject]
let weather = Weather(data: json)
observer.onNext(weather)
observer.onCompleted()
}
catch {
}
}
})
downloadTask.resume()
return AnonymousDisposable {
downloadTask.cancel()
}
})
}
Пока модель создана, я пришлю его к наблюдатель и полный
На вид контроллера, я делаю
viewModel.result
.subscribe(onNext: { [weak self] model in
self?.weatherModel = model
dispatch_async(dispatch_get_main_queue(), {
self?.cityLabel.text = model.cityName
self?.temperatureLabel.text = model.cityTemp?.description
})
},
onError: { (error) in
print("Error is \(error)")
},
onCompleted:{
print("Complete")
}
)
{ print("Dealloc")}
.addDisposableTo(disposeBag)
}
Он работает так, как ожидалось, пользовательский интерфейс обновляется и показывает мне, что я хочу. Тем не менее, я только что понял, что onCompleted
никогда не вызывается. Я предполагаю, что если все сделаю правильно, я должен распечатать его.
Любые идеи по этой проблеме. Все комментарии приветствуются здесь.
Вы посылаете «полный» сигнал вашему подписчику? –
Пожалуйста, добавьте код, в котором вы на карте, от 'Observable' до 'Observable ' –
@ArturoMenchaca: я только что обновил свои коды. пожалуйста, взгляните еще раз. – tonytran