Предотвратите немедленный вызов закрытия приемника receiveValue - PullRequest
1 голос
/ 06 марта 2020

Рассмотрим следующий код (вы можете сделать это прямо на игровой площадке):

class Foo: ObservableObject {
    @Published var bar = "bar"
}

let foo = Foo()
let someSubscriber = foo.$bar
    .sink { value in
        print("value is \(value)")
    }

Хотя Foo только что был инициализирован один раз и его член bar никогда не менялся, приемник выполняет его receiveValue закрытие немедленно. Есть ли способ предотвратить этот начальный вызов, например, есть ли оператор, который я мог упустить из виду?

1 Ответ

3 голосов
/ 06 марта 2020

Вы можете использовать оператор dropFirst. Без аргументов, он отбрасывает только первый вывод из апстрима.

let someSubscriber = foo.$bar
    .dropFirst()
    .sink { value in
        print("value is \(value)")
    }

Для решения проблем, поднятых в комментариях:

Каждая реализация Publisher может решить, что делать с каждым новым подписчиком. Это политическое решение, а не недостаток дизайна. Разные Publisher принимают разные решения. Вот несколько примеров:

  • PassthroughSubject не публикует немедленно sh что-либо.
  • CurrentValueSubject немедленно публикует его текущее значение.
  • NSObject.KeyValueObservingPublisher немедленно публикует текущее значение наблюдаемого свойства, если и только если оно создано с опцией .initial.
  • Published.Publisher (это тип, который вы получаете для свойства @Published) публикует текущее Стоимость имущества сразу.
...