web-dev-qa-db-ja.com

iOS Swift Combine:Cancel a Set <AnyCancellable>

キャンセル可能なセットをViewControllerに保存した場合:

_private var bag = Set<AnyCancellable>()
_

Wichには複数のサブスクリプションが含まれています。

1-deinitでサブスクリプションをキャンセルする必要がありますか?またはそれは自動的に仕事をしますか?

2-その場合、保存されているすべてのサブスクリプションをキャンセルするにはどうすればよいですか?

_bag.removeAll() is enough?
_

または、セットを繰り返し処理して、すべてのサブスクリプションを1つずつキャンセルする必要がありますか?

_for sub in bag {
   sub.cancel()
}
_

Appleは、保存されたAnyCancellableがメモリに保存されるまでサブスクリプションは有効であると述べています。したがって、bag.removeAll()を使用してキャンセル可能オブジェクトの割り当てを解除するだけで十分だと思いますか?

6
Andrea Miotto

パイプラインを作成して、キャンセラーをしない状態変数に保存してみてください。非同期操作に遭遇するとすぐにパイプラインが停止することがわかります。これは、CancellableがARCによってクリーンアップされ、自動的にキャンセルされたためです。したがって、パイプラインへのすべての参照を解放する場合、パイプラインでキャンセルを呼び出す必要はありません。

ドキュメント から:

AnyCancellableインスタンスは、初期化解除されると自動的にcancel()を呼び出します。

2
Gil Birman