Что такое PassthroughSubject & CurrentValueSubject - PullRequest
0 голосов
/ 02 марта 2020

Я случайно заглянул в новую платформу Combine от Apple, где вижу две вещи

PassthroughSubject<String, Failure>

CurrentValueSubject<String, Failure>

Может кто-нибудь объяснить мне, что означает и их использование?

Ответы [ 2 ]

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

Оба PassthroughSubject и CurrentValueSubject являются издателями, которые соответствуют протоколу Subject, что означает, что вы можете вызывать send для них до pu sh новых значений по желанию.

Основной Разница в том, что CurrentValueSubject имеет чувство состояния (текущее значение), а PassthroughSubject просто передает значения непосредственно своим подписчикам, не запоминая «текущее» значение:

var current = CurrentValueSubject<Int, Never>(10)
var passthrough = PassthroughSubject<Int, Never>()

current.send(1)
passthrough.send(1)

current.sink(receiveValue: { print($0) })
passthrough.sink(receiveValue: { print($0) })

Вы увидите, что current.sink вызывается немедленно с 1. passthrough.sink не вызывается, потому что у него нет текущего значения. Приемник будет вызываться только для значений, которые отправляются после подписки.

Обратите внимание, что вы также можете получить и установить текущее значение CurrentValueSubject, используя его свойство value:

current.value // 1
current.value = 5 // equivalent to current.send(5)

Это невозможно для проходного предмета.

0 голосов
/ 02 марта 2020

PassthroughSubject и CurrentValueSubject - оба Publisher s - тип, представленный Combine - на который вы можете подписаться (выполнение операций со значениями, когда значения доступны).

Они оба предназначены для упростить переход к использованию парадигмы Combine. У них обоих есть значение и тип ошибки, и вы можете «отправлять» им значения (делая значения доступными для всех подписчиков)

Основное различие между двумя, которые я видел, состоит в том, что CurrentValueSubject начинается со значения, а PassthroughSubject - нет. PassthroughSubject кажется, что проще * gr asp концептуально, по крайней мере для меня.

PassthroughSubject можно легко использовать вместо шаблона делегата или для преобразования существующего шаблона делегата в Combine.

//Replacing the delegate pattern
class MyType {
    let publisher: PassthroughSubject<String, Never> = PassthroughSubject()

    func doSomething() {
        //do whatever this class does

        //instead of this:
        //self.delegate?.handleValue(value)

        //do this:
        publisher.send(value)
    }
}

//Converting delegate pattern to Combine
class MyDel: SomeTypeDelegate {
    let publisher: PassthroughSubject<String, Never> = PassthroughSubject()

    func handle(_ value: String) {
        publisher.send(value)
    }
}

Оба эти примера используют String в качестве типа значения, хотя это может быть что угодно.

Надеюсь, это поможет!

...