保留信号或SignalProducer?

时间:2016-11-30 20:31:14

标签: swift reactive-cocoa

我是否有责任维护对SignalSignalProducer的引用,例如,使用实例变量?

换句话说,当它们被解除分配时,它们会自动消失并停止发送事件吗?

1 个答案:

答案 0 :(得分:1)

仅供参考,没有必要,Signal将被处置并停止转发事件。

Signal是一个类类型,如果没有人引用它,它应该是deinit。 但是,Signal实现引入了一种保留自身的棘手方法,请参阅state属性,以便临时存在一些内存泄漏。如源代码所示,如​​果Signal上有一些观察者订阅,则state会依次保留它,直到所有观察者都取消订阅或Signal收到已完成/错误/中断事件。

这里有一些标记的代码段。

// definition of SignalState
private struct SignalState<Value, Error: Swift.Error> {
    var observers: Bag<Signal<Value, Error>.Observer> = Bag()
    var retainedSignal: Signal<Value, Error>?  // here is the key
}

public func observe(_ observer: Observer) -> Disposable? {
    var token: RemovalToken?
    state.modify {
        $0?.retainedSignal = self  // retain self when one observer on
        token = $0?.observers.insert(observer)
    }

    if let token = token {
        return ActionDisposable { [weak self] in
            if let strongSelf = self {
                strongSelf.state.modify { state in
                    state?.observers.remove(using: token)
                    if state?.observers.isEmpty ?? false {
                        // break retain cycle when disposed
                        state!.retainedSignal = nil  
                    }
                }
            }
        }
    } else {
        observer.sendInterrupted()
        return nil
    }
}

SignalProducer怎么样? 它非常直观,SignalProducer只是struct类型,你不应该考虑它的生命周期。