Mon résumé RxSwift ⑤ (Qu'est-ce que les sujets / relais?)

Cet article s'intitule Mon résumé RxSwift ①, Mon résumé RxSwift②, Mon résumé RxSwift ③ (Qu'est-ce qui est observable? --Partie 1), [Mon résumé RxSwift ④ (Qu'est-ce que disposebag?)](Https: //qiita.com/Masa_asaM/items/0b1196940cb3f5fcfe0b) est une continuation.

Qu'est-ce qu'un sujet?

«Subject» fonctionne à la fois comme «observateur» et «observable». Il peut recevoir des événements, les traiter et générer des événements. ..

PublishSubject PublishSubject est unSubject qui commence sans valeur initiale et indique à abonné uniquement les éléments nouvellement publiés après s'abonner. (Cependant, «terminé» / «erreur» est également transmis à «l'abonné» qui «s'abonne» après avoir été libéré.) Comme le montre le diagramme en marbre, image.png Devient De plus, si vous exprimez le diagramme en marbre dans le code,

PublishSubject.swift


let publishSubject = PublishSubject<String>()
publishSubject.onNext("1")
let subscriber1 = publishSubject
    .subscribe{ event in
        print("subscriber1:" , event.element ?? event)
}
publishSubject.onNext("2")
let subscriber2 = publishSubject
    .subscribe{ event in
        print("subscriber2:" , event.element ?? event)
}
publishSubject.onNext("3")
publishSubject.onCompleted()
let subscriber3 = publishSubject
    .subscribe{ event in
        print("subscriber3:" , event.element ?? event)
}

production


subscriber1: 2
subscriber1: 3
subscriber2: 3
subscriber1: completed
subscriber2: completed
subscriber3: completed

Sera.

Quand est-il utilisé?

Puisque PublishSubject est pratique pour notifier l'abonné d'un nouvel événement, il est utilisé pour la mise à jour selon le clic de l'utilisateur. De plus, comme il est excellent en temps réel, il peut être appliqué aux chats et autres où des échanges fréquents sont effectués.

BehaviorSubject Behavior Subject est Publish Subject avec le concept de replay (= transmettre le dernier événement à l'abonné). Par conséquent, s'il n'y a pas de valeur initiale, replay ne peut pas être exécuté et une erreur se produira. Il est essentiel d'avoir une valeur initiale ou de définir «élément» comme «optionnel».

Comme le montre le diagramme en marbre, image.png Sera. De plus, si vous exprimez le diagramme en marbre dans le code,

BehaviorSubject.swift


let behaviorSubject = BehaviorSubject<String>(value: "1")
let subscriber1 = behaviorSubject
    .subscribe{ event in
        print("subscriber1:" , event.element ?? event)
}
behaviorSubject.onNext("2")
let subscriber2 = behaviorSubject
    .subscribe{ event in
        print("subscriber2:" , event.element ?? event)
}
behaviorSubject.onNext("3")
behaviorSubject.onCompleted()
let subscriber3 = behaviorSubject
    .subscribe{ event in
        print("subscriber3:" , event.element ?? event)
}

production


subscriber1: 1
subscriber1: 2
subscriber2: 2
subscriber1: 3
subscriber2: 3
subscriber1: completed
subscriber2: completed
subscriber3: completed

Quand est-il utilisé?

Puisque BehaviorSubject peut afficher le dernier état de Subject dans la vue, il est utilisé dans des situations telles que mettre la dernière valeur dans placeholder à l'avance ou afficher un indicateur pendant le chargement.

ReplaySubject Avec BehaviorSubject, seul le dernier événement peut être transmis à l'abonné, mais avec ReplaySubject, le nombre d'événements spécifié dans la taille de la mémoire tampon peut être transmis. Toutefois, si vous augmentez la taille de la mémoire tampon ou utilisez une taille de données trop importante telle qu'une image, cela peut provoquer une insuffisance de la mémoire, soyez donc prudent. Comme le montre le diagramme en marbre, image.png Devient De plus, si vous exprimez le diagramme en marbre dans le code,

ReplaySubject.swift


let replaySubject = ReplaySubject<String>.create(bufferSize: 2)
replaySubject.onNext("1")
replaySubject.onNext("2")
let subscriber1 = replaySubject
    .subscribe { event in
        print("subscriber1:", event.element ?? event)
}
replaySubject.onNext("3")

production


subscriber1: 1
subscriber1: 2
subscriber1: 3

Sera.

Quand est-il utilisé?

Il est utilisé lorsque vous souhaitez faire une différence par rapport au précédent.

AsyncSubject ʻAsyncSubject transmet la dernière valeur à abonnéimmédiatement après la lecture decompleted`. Comme le montre le diagramme en marbre, image.png Sera.

Exprimant cela dans le code,

AsyncSubject.swift


let asyncSubject = AsyncSubject<String>()
asyncSubject.onNext("1")
let subscriber1 = asyncSubject
    .subscribe { event in
        print("subscriber1:", event.element ?? event)
}
asyncSubject.onNext("2")
let subscriber2 = asyncSubject
    .subscribe { event in
        print("subscriber2:", event.element ?? event)
}
asyncSubject.onNext("3")
asyncSubject.onCompleted()

production


subscriber1: 3
subscriber2: 3
subscriber1: completed
subscriber2: completed

Sera.

Quand est-il utilisé?

Utile lors de la réception de rappels d'API

Qu'est-ce que le relais?

«Relay» est le [wrapper] des «sujets» (https://qiita.com/dsudo/items/51ca822169ef9f8b9bc3). Son rôle en tant que wrapper est de ne pas accepter «erreur» ou «terminé», mais de ne transmettre que l'élément qui coule dans «next» avec «accept (_:)».

«Publish Relay» correspond à «Publish Subject» et «Behavior Relay» correspond à «Behavior Subject». Le code est comme suit.

PublishRelay.swift


let publishRelay = PublishRelay<String>()

let disposeBag = DisposeBag()
publishRelay.accept("1")
publishRelay
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)

publishRelay.accept("2")

production


2

BehaviorRelay.swift


let behaviorRelay = BehaviorRelay(value: "Initial value")
let disposeBag = DisposeBag()

behaviorRelay.accept("1")

behaviorRelay
    .subscribe {
        print("subscriber1:" , $0.element ?? $0)
}
.disposed(by: disposeBag)

behaviorRelay.accept("2")

behaviorRelay
    .subscribe {
        print("subscriber2:", $0.element ?? $0)
}
.disposed(by: disposeBag)

behaviorRelay.accept("3")

production


subscriber1: 1
subscriber1: 2
subscriber2: 2
subscriber1: 3
subscriber2: 3

Sera.

Recommended Posts

Mon résumé RxSwift ⑤ (Qu'est-ce que les sujets / relais?)
Mon résumé RxSwift ③ (Qu'est-ce qui est observable?)
Résumé de mon RxSwift ④ (Qu'est-ce qu'un sac d'élimination?)
Mon résumé RxSwift ②
Mon résumé RxSwift ①
Qu'est-ce que l'assertion Java? Résumé.
Qu'est-ce que Cubby
Qu'est-ce qui est nul? ]
Qu'est-ce que 'java
Qu'est-ce que Keycloak
Qu'est-ce que maven?
Qu'est-ce que Jackson?
Qu'est-ce que soi
Qu'est-ce que Jenkins
Qu'est-ce que ArgumentMatcher?
Qu'est-ce que IM-Juggling?
Qu'est-ce que les paramètres
Qu'est-ce que SLF4J?
Qu'est-ce que la façade? ??
Qu'est-ce que Java <>?
Qu'est-ce que Gradle?
Qu'est-ce que POJO
Qu'est-ce que 'java
Qu'est-ce que centOS
Qu'est-ce que RubyGem?
Qu'est-ce que before_action?
Qu'est-ce que Docker
Qu'est-ce que Byte?
Qu'est-ce que Tomcat
Qu'est-ce que l'assemblage Maven?
Qu'est-ce que `docker-compose up`?
Qu'est-ce qu'un constructeur
Qu'est-ce que vue cli
Qu'est-ce qu'une interface
Qu'est-ce que le moi de Ruby?
Qu'est-ce que le codage en dur?
Qu'est-ce qu'un flux
Qu'est-ce que l'attr_accessor de Ruby?
Qu'est-ce que l'encapsulation Java?
Qu'est-ce qu'une permission refusée?
Qu'est-ce que le contrôle d'instance?
Qu'est-ce qu'un initialiseur?
Qu'est-ce que Spring Tools 4
Qu'est-ce qu'un opérateur?
Qu'est-ce que l'orientation objet?
Qu'est-ce que le @VisibleForTesting de Guava?
Qu'est-ce qu'un modèle MVC?
Qu'est-ce qu'une annotation?
Qu'est-ce que la technologie Java?
Qu'est-ce que Java API-java
Qu'est-ce que @ (variable d'instance)?
Qu'est-ce que l'artefact de Gradle?
Qu'est-ce que l'audit JPA?
[Java] Qu'est-ce que flatMap?
Qu'est-ce qu'un servlet?
Qu'est-ce que le développement Web?