我可以在Swift中使用RunLoop进行实时对象观测吗



我有一个Process对象(有点像Model(。在一个过程中,我有一个元组数组

var listeners: [(WeakContainer<AnyObject>, (S) -> ())]

WeakContainer处理内部的弱引用。当Conainer的值变为nil时,我需要从listeners数组中移除一个元素。我的代码如下:

class Process<S> {

typealias Handler = (S) -> ()
typealias Listener = (container: Weak<AnyObject>, handler: StateHandler)

var listeners: [Listener] = []
private let runLoop = RunLoop()

init() {
runLoop.run(mode: .default, before: .now)
runLoop.perform { [weak self] in
self?.state.listeners.removeAll {
$0.container.value == nil
}
}
}

}

我的目标是否正确使用RunLoop?为什么?如果你能为我的情况提出一个更合适的替代方案(对物体的跟踪变为零(,我将不胜感激。

有一个NSMapTable集合,它可以灵活地配置各种内存保留策略。

下面是一个如何用弱键对象存储Handler对象的示例。Handler将被保留,直到密钥存在,并且在密钥删除时,该对将从集合中删除。

class Handler<Action> {
let action: Action
init(_ action: Action) {
self.action = action
}
}
var listeners = NSMapTable<AnyObject, Handler<(S)->Void>> (keyOptions: [.weakMemory, .objectPointerPersonality],
valueOptions: .strongMemory)

相关内容

  • 没有找到相关文章

最新更新