Я знаю, что в целом издатель более могущественен, чем закрытие, однако я хочу спросить и обсудить конкретный пример:
func getNotificationSettingsPublisher() -> AnyPublisher<UNNotificationSettings, Never> {
let notificationSettingsFuture = Future<UNNotificationSettings, Never> { (promise) in
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
promise(.success(settings))
}
}
return notificationSettingsFuture.eraseToAnyPublisher()
}
Я думаю, что это действительный пример будущего издателя, и его можно было бы использовать здесь вместо использования обработчика завершения. Давайте что-нибудь с этим сделаем:
func test() {
getNotificationSettingsPublisher().sink { (notificationSettings) in
// Do something here
}
}
Это работает, однако сообщит мне, что результат стока (AnyCancellable
) не используется. Поэтому всякий раз, когда я пытаюсь получить значение, мне нужно либо сохранить отменяемое значение, либо назначить его, пока я не получу значение.
Есть ли что-то вродеinkOnce или автоматического уничтожения отменяемых предметов? Иногда мне не нужны задания на отмененный. Однако я мог сделать это:
func test() {
self.cancellable = getNotificationSettingsPublisher().sink { [weak self] (notificationSettings) in
self?.cancellable?.cancel()
self?.cancellable = nil
}
}
Поэтому, как только я получаю значение, я отменяю подписку. (Думаю, я мог бы сделать то же самое при завершении закрытия раковины).
Как правильно это сделать? Потому что, если я использую замыкание, оно будет вызываться столько раз, сколько вызывается функция, а если оно вызывается только один раз, мне не нужно ничего отменять.
Вы бы сказали, что обычные обработчики завершения можно заменить на Combine, и если да, то как бы вы справились с получением одного значения и последующей отменой?
И последнее, но не менее важное: вызывается завершение, мне все еще нужно отменить подписку? Мне по крайней мере нужно обновить отменяемое и установить его на ноль, верно? Я предполагаю, что хранение подписок в наборе предназначено для длительных подписок, но как насчет подписок с одним значением?
Спасибо