我有View Controller,它有一些信号,我想在viewDidLoad()
中观察该信号的值。当View Controller死机时,我需要处理该信号:
override func viewDidLoad() {
super.viewDidLoad()
let composite = CompositeDisposable()
defer {
disposable = ScopedDisposable(composite)
}
composite += someSignal.take(during: self.reactive.lifetime).observeValues { ... }
}
是否有必要像在代码中一样将viewModel.alertSignal.take(during: self.reactive.lifetime).observeValues ...
的结果添加到ScopedDisposable对象:composite += ...
?或者只是致电take(during: self.reactive.lifetime)
就足够了?
答案 0 :(得分:1)
假设disposable
是ViewController的属性,它与take(during:)
的功能相同,因此您可以使用任何您喜欢的属性,但不需要同时使用它们!
override func viewDidLoad() {
super.viewDidLoad()
let composite = CompositeDisposable()
defer {
disposable = ScopedDisposable(composite)
}
composite += someSignal.observeValues { ... }
}
或
override func viewDidLoad() {
super.viewDidLoad()
someSignal.take(during: self.reactive.lifetime).observeValues { ... }
}
我个人更喜欢使用take(during:)
,因为它的代码更少。
答案 1 :(得分:0)
take(during:)
将在释放生命周期时使信号发送完成事件。这意味着将发生以下事件:
Deinit -> Completed event -> Terminated event -> Disposed event
使用ScopedDisposable时,流程如下:
Deinit -> Interrupted event -> Terminated event -> Disposed event
了解这种差异很重要,因为在第一种情况下,访问on(completed: () -> void)
中的生存期所有者(通常是自我)是不安全的,因为一旦完成,所有者已经被释放了!