注意:私は、強い参照サイクルを避けるという点について、(非常に多くの)回答と記事の多くを読んできました。しかし、私はこれらのサイクルを避ける特定の副産物をどのように扱うかについてのガイダンスを探しています。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は正しく動作するようにクロージャを設定する必要があります。
は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であっても、閉鎖はまだ返す必要があることが必要です
モデル(つまり、WHAT?)をクロージャの呼び出し元(Fooインスタンス)に返します。しかし、selfはゼロであるため、渡すモデルはありません。
質問
は、誰かがこのような状況で使用するパターンをお勧めしますか? ModelGetterが有効かどうかを確認したり、モデルが有効かどうか疑問に思ったりすることは望ましくありません。 Fooの目的のために、Fooが存在すれば、必要なモデルを常に得ることができなければなりません。
Fooのニーズを再設計するだけで、モデルを調達できない可能性を考慮に入れる必要がありますか?助けていただきありがとうございます。
ありがとうございました。私はこのアプローチを取って、プログラマー/設計ミスとしてクラッシュを処理します。 – Womble