Издатели Swift Combine и обработчик завершения и когда отменять - PullRequest
2 голосов
/ 27 мая 2020
• 1000 и его можно использовать здесь вместо использования обработчика завершения. Давайте что-нибудь с ним сделаем:
func test() {
    getNotificationSettingsPublisher().sink { (notificationSettings) in
       // Do something here        
    }
}

Это работает, однако сообщит мне, что результат стока (AnyCancellable) не используется. Поэтому всякий раз, когда я пытаюсь получить значение, мне нужно либо сохранить отменяемое, либо присвоить его, пока я не получу значение. Иногда задачи отмененные не нужны. Однако я мог сделать это:

func test() {
   self.cancellable = getNotificationSettingsPublisher().sink { [weak self] (notificationSettings) in
      self?.cancellable?.cancel()
      self?.cancellable = nil
   }
}

Поэтому, получив значение, я отменяю подписку. (Думаю, я мог бы сделать то же самое при завершении закрытия раковины).

Как правильно это сделать? Потому что, если я использую замыкание, оно будет вызываться столько раз, сколько вызывается функция, а если оно вызывается только один раз, мне не нужно ничего отменять. можно заменить на Combine, и если да, то как бы вы справились с получением одного значения и его отменой?

И последнее, но не менее важное: вызывается завершение, мне все равно нужно отменить подписку? Мне, по крайней мере, нужно обновить отменяемое и установить его на ноль, верно? Я предполагаю, что хранение подписок в наборе предназначено для длительных подписок, но как насчет подписок с одним значением?

Спасибо

1 Ответ

4 голосов
/ 27 мая 2020

Вместо использования оператора .sink вы можете напрямую использовать абонента Sink. Таким образом, вы не получите AnyCancellable, которое нужно сохранить. Когда издатель завершает подписку, Combine все очищает.

func test() {
    getNotificationSettingsPublisher()
        .subscribe(Subscribers.Sink(
            receiveCompletion: { _ in },
            receiveValue: ({
                print("value: \($0)")
            })
        ))
}
...