【发布时间】:2021-04-22 01:55:59
【问题描述】:
考虑下面的代码。
- 在 tapButton 上,我们订阅 Observable
isFetched,然后调用fetchPopularMovies()。 -
fetchPopularMovies()依次调用 API。收到响应后,我们将发送OnNext(true)事件。
问题是,我在第二个按钮点击后收到多个事件。如果我添加 onCompleted(),我什至不会在第二个按钮点击时收到事件。我的期望是每次点击按钮都会触发一个事件。我在这里错过了什么?
class ViewController: UIViewController {
let popularMoviesURL = URL(string: "https://api.themoviedb.org/3/movie/popular?api_key=API_KEY")
var isFetched = BehaviorSubject<Bool?>(value:nil)
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func tapButton(_ sender: Any) {
let observable = isFetched.asObservable()
observable.subscribe(onNext: { observer in
guard let result = observer else { return }
print(result)
print("onNext Recieved")
}, onError: { _ in
print("onError Recieved")
}).disposed(by: disposeBag)
fetchPopularMovies()
}
func fetchPopularMovies() {
let task = URLSession.shared.dataTask(with: popularMoviesURL!) {(data, response, error) in
guard let _ = data else { return }
self.isFetched.onNext(true)
//self.isFetched.onCompleted()
}
task.resume()
}
}
【问题讨论】:
-
因为您每次点击按钮都会订阅
-
订阅就像报纸,一旦订阅,您将获得该报纸的所有未来版本。如果您订阅该报纸两到五次,您将获得两到五份该报纸。
-
在你的情况下 distinctuntilchanged
-
@SPatel 谢谢。我喜欢报纸的比喻。