5
votes

Qu'est-ce que PassthroughSubject & CurrentValueSubject

Il se trouve que je regarde le nouveau framework Combine d'Apple, où je vois deux choses

PassthroughSubject<String, Failure>

CurrentValueSubject<String, Failure>

Quelqu'un peut-il m'expliquer ce que cela signifie et leur utilisation?


1 commentaires

Vous pouvez commencer à partir d'ici en utilisant Combine - très utile.


4 Réponses :


2
votes

PassthroughSubject et CurrentValueSubject sont tous deux des Publisher - un type introduit par Combine - auquel vous pouvez vous abonner (en effectuant des opérations sur des valeurs lorsque des valeurs sont disponibles).

Ils sont tous deux conçus pour faciliter le passage à l'utilisation du paradigme Combine. Ils ont tous deux une valeur et un type d'erreur, et vous pouvez leur «envoyer» des valeurs (en mettant les valeurs à la disposition de tous les abonnés)

La principale différence entre les deux que j'ai vues est que CurrentValueSubject commence par une valeur, PassthroughSubject . PassthroughSubject semble plus facile à saisir conceptuellement, du moins pour moi.

PassthroughSubject peut facilement être utilisé à la place d'un modèle de délégué ou pour convertir un modèle de délégué existant en 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)
    }
}

Ces deux exemples utilisent String comme type de valeur, alors qu'il peut s'agir de n'importe quoi.

J'espère que cela t'aides!


1 commentaires

PassthroughSubject <(String, Bool), Never> () est la version la plus courte



17
votes

PassthroughSubject et CurrentValueSubject sont des éditeurs conformes au protocole Subject , ce qui signifie que vous pouvez appeler send sur eux pour pousser de nouvelles valeurs en aval à volonté.

La principale différence est que CurrentValueSubject a un sens de l'état (valeur actuelle) et PassthroughSubject simplement les valeurs directement à ses abonnés sans se souvenir de la valeur "actuelle":

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

Vous verrez que le current.sink est appelé immédiatement avec 1 . Le passthrough.sink n'est pas appelé car il n'a pas de valeur actuelle. Le récepteur ne sera appelé que pour les valeurs émises après votre abonnement.

Notez que vous pouvez également obtenir et définir la valeur actuelle d'un CurrentValueSubject aide de sa propriété value :

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) })

Ce n'est pas possible pour un sujet passthrough.


0 commentaires

6
votes

Je pense que nous pouvons faire des analogies avec des cas du monde réel.

PassthroughSubject = Un bouton poussoir de sonnette

Quand quelqu'un sonne à la porte, vous êtes averti uniquement si vous êtes chez vous (vous êtes l'abonné)

PassthroughSubject n'a pas d'état, il émet tout ce qu'il reçoit à ses abonnés.

CurrentValueSubject = Un interrupteur d'éclairage Quelqu'un allume les lumières de votre maison lorsque vous êtes à l'extérieur. vous rentrez chez vous et vous savez que quelqu'un les a allumés.

CurrentValueSubject a un état initial, conserve les données que vous avez placées comme état.


0 commentaires

0
votes

PassthroughSubject convient à des événements tels que l'action tap

CurrentValueSubject convient à l'état


0 commentaires