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.
«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,
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.
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, 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
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,
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.
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 de
completed`.
Comme le montre le diagramme en marbre,
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.
Utile lors de la réception de rappels d'API
«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