onCompleted никогда не вызывается
Используя RxSwift, цель моего проекта состоит в том, чтобы каждый раз, когда пользователь вводил город в строке поиска, он вызывал вызов текущей температуры. В настоящее время у меня есть viewModel
который содержит
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.
В сервисе API я упаковываю сетевой вызов, используя 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
никогда не звонят. Я предполагаю, что если я все делаю правильно, я должен распечатать это.
Любые идеи по этому вопросу. Все комментарии приветствуются здесь.
1 ответ
result
кажется, происходит от searchingTerm
, который является Variable
,
Variable
только завершено, когда они освобождаются ( источник), поэтому имеет смысл, что result
не получает onCompleted
,
Имеет смысл, что это поведение. Наблюдаемое никогда не испустит новые значения после onCompleted
, И вы не хотите, чтобы он прекратил обновление после того, как будет представлен первый результат поиска.