2016-11-01 2 views
1

С помощью 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 никогда не вызывается. Я предполагаю, что если все сделаю правильно, я должен распечатать его.

Любые идеи по этой проблеме. Все комментарии приветствуются здесь.

+0

Вы посылаете «полный» сигнал вашему подписчику? –

+1

Пожалуйста, добавьте код, в котором вы на карте, от 'Observable ' до 'Observable ' –

+0

@ArturoMenchaca: я только что обновил свои коды. пожалуйста, взгляните еще раз. – tonytran

ответ

3

result, как представляется, получено из searchingTerm, что является Variable.

Variable только завершенным, когда они быть высвобождены (source), так что имеет смысл, что result не получает onCompleted.

Имеет смысл, что это поведение. Наблюдаемый никогда не будет излучать новые значения после onCompleted. И вы не хотите, чтобы он переставал обновляться после представления первого результата поиска.

+0

спасибо. Исправьте меня, если я ошибаюсь, значит, 'Variable' завершается только тогда, когда' viewModel' освобождается? – tonytran

+0

Это правильно. – tomahh

Смежные вопросы