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, И вы не хотите, чтобы он прекратил обновление после того, как будет представлен первый результат поиска.

Другие вопросы по тегам