deinit
ваш ViewController будет удален из памяти. Все его переменные экземпляра будут освобождены.
Документы для Combine > Publisher > assign(to:on:)
говорят:
Экземпляр AnyCancellable. Вызовите cancel () в этом экземпляре, если вы больше не хотите, чтобы издатель автоматически назначал свойство. Деинициализация этого экземпляра также отменит автоматическое назначение.
1 - Следует ли мне отменить подписку в деините? или он делает работу автоматически?
В этом нет необходимости, он выполняет свою работу автоматически. Когда ваш ViewController будет освобожден, переменная экземпляра bag
также будет освобождена. Поскольку ссылки на ваши AnyCancellable
больше не будут, назначение закончится.
2 - Если да, как я могу отменить все сохраненные подписки?
Не так. Но часто у вас могут быть какие-то подписки, которые вы хотите запускать и останавливать, например, _5 _ / _ 6_. В этом случае ваш ViewController все еще находится в памяти.
Итак, в viewDidDissappear
вы можете делать bag.removeAll()
, как вы и подозревали. Это удалит ссылки и остановит назначение.
Вот код, который вы можете запустить, чтобы увидеть .removeAll()
в действии:
var bag = Set<AnyCancellable>()
func testRemoveAll() {
Timer.publish(every: 1, on: .main, in: .common).autoconnect()
.sink { print("===== timer: \($0)") }
.store(in: &bag)
Timer.publish(every: 10, on: .main, in: .common).autoconnect()
.sink { _ in self.bag.removeAll() }
.store(in: &bag)
}
Первый таймер срабатывает каждую секунду и распечатывает строку. Второй таймер сработает через 10 секунд, а затем вызовет bag.removeAll()
. Тогда оба издателя таймера будут остановлены.
https://developer.apple.com/documentation/combine/publisher/3235801-assign
person
Andy
schedule
08.06.2020