使用ScopedDisposable和take(期间:......)之间有什么区别?

时间:2017-12-29 16:14:22

标签: ios swift reactive-cocoa reactive-swift

我有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)就足够了?

2 个答案:

答案 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)中的生存期所有者(通常是自我)是不安全的,因为一旦完成,所有者已经被释放了!