通过使用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)
}
它按预期工作,UI更新并显示我想要的内容。但是,我刚刚意识到onCompleted
永远不会被调用。我假设如果我做的一切正确,我必须将它打印出来。
有关此问题的任何想法。欢迎所有评论。
答案 0 :(得分:3)
result
似乎来自searchingTerm
,Variable
。
Variable
仅在取消分配时才完成(source),因此result
无法接收onCompleted
是有意义的。
行为就是这个意义。在onCompleted
之后,一个observable永远不会发出新的值。并且您不希望它在第一个搜索结果出现后停止更新。