Dieser Artikel ist Meine RxSwift-Zusammenfassung ①, Meine RxSwift-Zusammenfassung② Meine RxSwift-Zusammenfassung ③ (Was ist beobachtbar? - Teil 1), [Meine RxSwift-Zusammenfassung ④ (Was ist Disposebag?)](Https: //qiita.com/Masa_asaM/items/0b1196940cb3f5fcfe0b) ist eine Fortsetzung.
"Subjekt" arbeitet sowohl als "Beobachter" als auch als "beobachtbar". Es kann Ereignisse empfangen, verarbeiten und Ereignisse generieren. ..
PublishSubject
PublishSubject
ist einSubject
, das ohne Anfangswert beginnt und Abonnent
nur die neu veröffentlichten Elemente nach Abonnieren
mitteilt. ("Abgeschlossen" / "Fehler" wird jedoch auch an den "Abonnenten" übertragen, der nach seiner Freigabe "Abonnieren" war.)
Wie im Marmordiagramm gezeigt,
Wird
Wenn Sie das Marmordiagramm im Code ausdrücken,
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)
}
Ausgabe
subscriber1: 2
subscriber1: 3
subscriber2: 3
subscriber1: completed
subscriber2: completed
subscriber3: completed
Wird sein.
Da "PublishSubject" praktisch ist, wenn "Abonnent" über ein neues Ereignis informiert wird, wird es zum Aktualisieren entsprechend dem Klick des Benutzers verwendet. Da es in Echtzeit hervorragend ist, kann es außerdem auf Chats und dergleichen angewendet werden, bei denen häufiger Austausch durchgeführt wird.
BehaviorSubject
Behaviour Subject
ist Publish Subject
mit dem Konzept von Replay
(= Übertragen des neuesten Ereignisses an Subscriber
). Wenn kein Anfangswert vorhanden ist, kann daher keine Wiederholung durchgeführt werden, und es tritt ein Fehler auf. Es ist wichtig, einen Anfangswert zu haben oder "Element" als "optional" zu definieren.
Wie im Marmordiagramm gezeigt, Wird sein. Wenn Sie das Marmordiagramm im Code ausdrücken,
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)
}
Ausgabe
subscriber1: 1
subscriber1: 2
subscriber2: 2
subscriber1: 3
subscriber2: 3
subscriber1: completed
subscriber2: completed
subscriber3: completed
Da "BehaviorSubject" den neuesten Status von "Subject" in der Ansicht anzeigen kann, wird es in Situationen verwendet, in denen beispielsweise der neueste Wert im Voraus in "placeholder" eingegeben oder während des Ladens ein Indikator angezeigt wird.
ReplaySubject Mit "BehaviorSubject" konnte nur das letzte Ereignis an "Subscriber" übertragen werden, aber mit "ReplaySubject" kann die in der Puffergröße angegebene Anzahl von Ereignissen übertragen werden. Wenn Sie jedoch die Puffergröße erhöhen oder zu viele Daten verwenden, z. B. ein Bild, kann dies zu Speicherengpässen führen. Seien Sie also vorsichtig. Wie im Marmordiagramm gezeigt, Wird Wenn Sie das Marmordiagramm im Code ausdrücken,
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")
Ausgabe
subscriber1: 1
subscriber1: 2
subscriber1: 3
Wird sein.
Es wird verwendet, wenn Sie einen Unterschied zum vorherigen machen möchten.
AsyncSubject "AsyncSubject" übergibt den letzten Wert unmittelbar nach der Wiedergabe von "erledigt" an "Teilnehmer". Wie im Marmordiagramm gezeigt, Wird sein.
Dies im Code ausdrücken,
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()
Ausgabe
subscriber1: 3
subscriber2: 3
subscriber1: completed
subscriber2: completed
Wird sein.
Nützlich beim Empfang von API-Rückrufen
"Relais" ist der [Wrapper] von "Subjekten" (https://qiita.com/dsudo/items/51ca822169ef9f8b9bc3). Seine Rolle als Wrapper besteht darin, "Fehler" und "Abgeschlossene" nicht zu akzeptieren, sondern nur die Elemente zu übergeben, die in "Weiter" mit "Akzeptieren" (_ :) "fließen.
"Relais veröffentlichen" entspricht "Betreff veröffentlichen", und "Verhaltensrelais" entspricht "Betreff". Der Code lautet wie folgt.
PublishRelay.swift
let publishRelay = PublishRelay<String>()
let disposeBag = DisposeBag()
publishRelay.accept("1")
publishRelay
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
publishRelay.accept("2")
Ausgabe
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")
Ausgabe
subscriber1: 1
subscriber1: 2
subscriber2: 2
subscriber1: 3
subscriber2: 3
Wird sein.
Recommended Posts