首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用RunLoop实时观察对象在Swift?

我可以使用RunLoop实时观察对象在Swift?
EN

Stack Overflow用户
提问于 2022-09-09 09:39:33
回答 1查看 30关注 0票数 0

我有一个流程对象(是某种模型)。在进程中,我有一个元组数组。

代码语言:javascript
复制
var listeners: [(WeakContainer<AnyObject>, (S) -> ())]

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

代码语言:javascript
复制
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?为什么?如果你能为我的情况提出一个更合适的替代方案,我将不胜感激(对目标的跟踪变为零)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-09 10:39:22

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

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

代码语言:javascript
复制
class Handler<Action> {
    let action: Action
    init(_ action: Action) {
        self.action = action
    }
}

var listeners = NSMapTable<AnyObject, Handler<(S)->Void>> (keyOptions: [.weakMemory, .objectPointerPersonality],
                                                           valueOptions: .strongMemory)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73660147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档