RxSwift-Abhängigkeit
Wenn Sie RxSwift verwendet haben, sind Sie mit diesem Code-Snippet vertraut:
var taskChangeEvent = BehaviorSubject<Bool>()
...
if newValue != oldValue {
subject.onNext(newValue)
}
...
taskChangeEvent.subscribe(onNext: { [weak self] done in
....
}).dispose(by: disposeBag)
Um diesen Prozess etwas einfacher zu machen und die Abhängigkeit von RxSwift auf einen einzigen Ort zu reduzieren, baue ich eine einfache Klasse, die nur diese Schritte ausführt.
import RxSwift
class EventSerializer<T: Equatable> {
private var disposeBag = DisposeBag()
fileprivate let contactPoint: BehaviorSubject<T>
var value: T
func send(_ newValue: T) {
contactPoint.onNext(newValue)
self.value = newValue
}
func sendValueIf(_ newValue: T, compareWith: (_ oldValue: T, _ newValue: T) -> Bool) {
if compareWith(self.value, newValue) {
contactPoint.onNext(newValue)
self.value = newValue
}
}
func listen(onChange: @escaping ((T) -> Void)) {
contactPoint.subscribe( onNext: { value in
onChange(value)
}).disposed(by: disposeBag)
}
init(defaultValue: T, contactPoint: BehaviorSubject<T>? = nil) {
self.contactPoint = contactPoint ?? BehaviorSubject<T>(value: defaultValue)
self.value = defaultValue
}
}
Die Auslöselogik befindet sich innerhalb der Klasse und Sie können die Logik in eine separate Funktion aufteilen.
Das Anhören von Streams ist viel sauberer und es gibt keinen disposeBag im gesamten Code.
var task = EventSerilizer<Bool>(defaultValue: false)
...
func shouldInformTaskChange(_ oldValue: Bool, _ newValue: Bool) {
oldValue != newValue
}
task.sendValueIf(true, compareWith: shouldInforTaskChange)
...
task.listen { [weak self] value in
....
}
func listenToCombineLatest<E: Equatable>(with otherSerializer: EventSerializer<E>, onChange: @escaping ((T, E) -> Void)) {
Observable.combineLatest(self.contactPoint, otherSerializer.contactPoint).subscribe(onNext: { tValue, eValue in
onChange(tValue, eValue)
}).disposed(by: disposeBag)
}
Eine Randnotiz zur Verwendung von BehaviorSubject
Wie Sie wissen, gibt das BehaviorSubject das letzte Ereignis aus, auf das zu hören beginnt. Dies könnte während der Einrichtungsphase ein Problem sein, da es wie bei einer Klempnerarbeit ist, während sich Wasser in den Rohren befindet. Du wirst besucht, während du noch nicht bereit bist. Auf der anderen Seite können Sie mit PublishSubject Pipes miteinander verbinden und dann die Ereignisse senden.
Erwägen Sie daher die Verwendung von PublishSubject, wenn Sie etwas Vorbereitungszeit benötigen, bevor Sie Ereignisse erhalten.

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































