【问题标题】:What difference between using ScopedDisposable and take(during: ...)?使用 ScopedDisposable 和 take(during: ...) 有什么区别?
【发布时间】:2017-12-29 16:14:22
【问题描述】:

我有视图控制器,它有一些信号,我想在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)就够了?

【问题讨论】:

    标签: ios swift reactive-cocoa reactive-swift


    【解决方案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:),因为它的代码更少。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        • 2012-01-21
        • 2018-07-17
        相关资源
        最近更新 更多