保留 Signal 或 SignalProducer?
Retaining a Signal or SignalProducer?
我有责任维护对 Signal
或 SignalProducer
的引用,例如,使用实例变量吗?
换句话说,当它们被释放时,它们会自动消失并停止发送事件吗?
仅供参考,没有必要,Signal
将被处理并停止转发事件。
Signal
是一个class类型,如果没有人引用它,应该是deinit。
但是,Signal
实现引入了一种保留自身的技巧,请参阅 state
属性,因此临时存在一些内存泄漏。如源代码所示,如果有一些观察者订阅了 Signal
,那么 state
会依次保留它,直到所有观察者取消订阅或 Signal
收到 completed/error/interrupted 事件。
这里是一些标记的代码片段。
// 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 {
[=10=]?.retainedSignal = self // retain self when one observer on
token = [=10=]?.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
类型,你不应该考虑它的生命周期。
我有责任维护对 Signal
或 SignalProducer
的引用,例如,使用实例变量吗?
换句话说,当它们被释放时,它们会自动消失并停止发送事件吗?
仅供参考,没有必要,Signal
将被处理并停止转发事件。
Signal
是一个class类型,如果没有人引用它,应该是deinit。
但是,Signal
实现引入了一种保留自身的技巧,请参阅 state
属性,因此临时存在一些内存泄漏。如源代码所示,如果有一些观察者订阅了 Signal
,那么 state
会依次保留它,直到所有观察者取消订阅或 Signal
收到 completed/error/interrupted 事件。
这里是一些标记的代码片段。
// 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 {
[=10=]?.retainedSignal = self // retain self when one observer on
token = [=10=]?.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
类型,你不应该考虑它的生命周期。