gpt4 book ai didi

Swift - 在基于闭包的配置中避免强引用循环

转载 作者:可可西里 更新时间:2023-11-01 00:39:33 25 4
gpt4 key购买 nike

请注意:我已经阅读了很多(非常多)关于避免强引用循环主题的答案和文章。但是,我正在寻找有关如何处理避免这些循环的特定副产品的指导。

在下面的示例中,类 Foo 被设计为使用闭包进行配置。对闭包的引用被缓存以备后用。

只要需要模型数据,就会调用闭包。为了使 Foo 正常工作,数据必须存在。

class Foo
{
typealias ModelGetter = (() -> Model)
fileprivate var _modelGetter: ModelGetter!

...

func configure(with modelGetter: @escaping ModalGetter)
{
_modelGetter = modelGetter
}

func printLastestModel()
{
// Get the latest model, do something with it.
precondition(_modelGetter != nil)
let model = _modelGetter()
print(model)
}
}

在上面的代码中,_modelGetter 被隐式​​解包。尽管我可以将它定义为 Optional,并根据需要展开它,但 Foo 始终需要设置闭包才能正常工作,因此需要隐式展开。

创建 Foo 实例并配置它:

let foo = Foo()
foo.configure(with: { self.makeModel() })
foo.printLatestModel()

但是,这会创建一个保留循环。

因此,使用了[weak self],我们检查self的可选性:

foo.configure(with: { [weak self] in
guard let strongSelf = self else { return **WHAT** }
return strongSelf.makeModel()
})

问题

这要求即使 self 可能为 nil,闭包仍然需要返回一个模型(即什么?)给闭包的调用者(Foo 实例)。但是,由于 self 为 nil,我没有要移交的模型。

问题

有人可以推荐在这种情况下使用的模式吗?最好,我不希望 Foo 检查 modelGetter 是否有效,或者想知道 Model 是否有效。对于 Foo 的目的,如果 Foo 存在,那么它必须始终能够获得它需要的模型。

或者,我是否应该重新设计 Foo 的需求,以考虑无法采购模型的可能性?谢谢你的帮助。

最佳答案

如果Class是Foo的所有者,建议设置[unowned self]而不是[weak self]。它会解决问题。如果一个类是另一个类的所有者,它永远不会出现问题,但如果逻辑错误,它就会出现崩溃。这还不错,因为它向您发出信号,表明您破坏了项目中的某些内容。

关于Swift - 在基于闭包的配置中避免强引用循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47298348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com