Zależność RxSwift
Jeśli korzystałeś z RxSwift, znasz ten fragment kodu:
var taskChangeEvent = BehaviorSubject<Bool>()
...
if newValue != oldValue {
subject.onNext(newValue)
}
...
taskChangeEvent.subscribe(onNext: { [weak self] done in
....
}).dispose(by: disposeBag)
Aby nieco uprościć ten proces i zredukować zależność RxSwift do jednego miejsca, tworzę prostą klasę, wykonując tylko te kroki.
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
}
}
Logika odpalania jest wewnątrz klasy i możesz podzielić logikę na osobną funkcję.
Słuchanie strumienia jest o wiele czystsze i nie ma w całym kodzie żadnego pliku deleteBag.
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)
}
Na marginesie uwaga dotycząca używania BehaviorSubject
Jak wiesz, BehaviourSubject wydaje ostatnie zdarzenie, którego zaczyna nasłuchiwać. Może to stanowić problem podczas fazy konfiguracji, ponieważ jest to jak hydraulika, gdy w rurach jest woda. Jesteś odwiedzany, gdy nie jesteś jeszcze gotowy. Z drugiej strony PublishSubject umożliwia łączenie potoków, a następnie wysyłanie zdarzeń.
Więc rozważ użycie PublishSubject, jeśli potrzebujesz trochę czasu na przygotowanie przed otrzymaniem wydarzeń.

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































