참고 : 강력한 참조주기를 피하는 주제에 대한 (많은) 답변과 기사를 많이 읽었습니다. 그러나 이러한 사이클을 피하는 특정 부산물을 처리하는 방법에 대한 지침을 찾고 있습니다.Swift - 클로저 기반 구성에서 강력한 참조주기 피하기
다음 예제에서 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는 항상 제대로 작동하려면 클로저가 필요하므로 암시 적 언 래핑이 필요합니다.
푸의 인스턴스를 제작하고이를 구성 :
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()
})
문제점이 자기가 nil이 될 수있다하더라도, 폐쇄 여전히를 반환해야한다는 요구
모델 (즉, 무엇?) 클로저의 호출자 (Foo 인스턴스). 그러나 self는 무효이므로 넘겨 줄 모델이 없습니다.
질문
누군가가이 상황에서 사용할 수있는 패턴을 추천 할 수 있습니까? 가급적이면 Foo가 modelGetter가 유효한지 여부를 확인하거나 Model이 유효한지 궁금하게 생각하지 않도록하고 싶습니다. Foo의 목적을 위해, Foo가 존재하면 항상 필요한 모델을 얻을 수 있어야합니다.
아니면 Foo의 요구를 재 설계해야 모델을 조달 할 수없는 가능성을 고려해야합니까? 어떤 도움을 주셔서 감사합니다.
고맙습니다. 이 접근법을 취하고 프로그래머/설계 오류로 인한 모든 충돌을 처리합니다. – Womble