0

我有视图控制器,它有一些信号,我想观察来自该信号的值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)就够了?

4

2 回答 2

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:)因为它的代码更少。

于 2017-12-30T10:12:44.637 回答
0

take(during:)当生命周期被释放时,将使信号发送完成事件。这意味着将发生以下事件:

Deinit -> Completed event -> Terminated event -> Disposed event

使用 ScopedDisposable 时,流程将如下所示:

Deinit -> Interrupted event -> Terminated event -> Disposed event

理解这种差异很重要,因为在第一种情况下,访问生命周期所有者(通常是自我)是不安全的,on(completed: () -> void)因为一旦完成,所有者就已经被释放了!

于 2020-12-04T14:41:09.177 回答