ios - onCompleted 永远不会被调用

标签 ios swift reactive-programming rx-swift

通过使用 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()
        }
    })
}

只要模型创建好了,我就把它发给观察者并完成

在 View Controller 中,我正在做

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 永远不会被调用。我假设如果我做的一切都正确,我必须打印出来。

关于这个问题的任何想法。欢迎所有评论。

最佳答案

result似乎源自 searchingTerm ,这是一个 Variable .

Variable只有在它们被释放时才完成( source )所以 result 是有道理的没有收到 onCompleted .

这个行为是有道理的。在 onCompleted 之后,Observable 将永远不会发出新值。 .而且您不希望它在第一个搜索结果出现后停止更新。

关于ios - onCompleted 永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40363779/

相关文章:

ios - 找不到适用于 iOS PhoneGap 的 PushPlugin

ios - Q :Controller present 2 second ,如何让它看起来只有一个转换?

ios - 动画 TableView 高度约束但动画正在跳跃

javascript - 在 RxJS 中,如何在没有主题的情况下直接链接 pub 子系统中的生产者和消费者?

angular - 如何使用 'merge' 来限制可观察值列表的并发性,但仅在所有可观察值完成后才返回?

iphone - IBAction - 在连接到服务器之前做一些事情

ios - 有没有办法最小化两个 pragma 标记之间的所有内容

ios - Xcode 错误地将 Storyboard 元素绑定(bind)到 Exit

swift - 导航按钮需要从最后一个 View 转到第一个 View

java - 使用 Spring WebClient 时没有从端点接收到数据,但我可以使用curl 来获取数据