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?
4 Réponses :
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!
PassthroughSubject <(String, Bool), Never> () est la version la plus courte
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.
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.
PassthroughSubject convient à des événements tels que l'action tap
CurrentValueSubject convient à l'état
Vous pouvez commencer à partir d'ici en utilisant Combine - très utile.