RxSwift Bağımlılığı

May 02 2023
RxSwift kullandıysanız, bu kod parçacığına aşinasınızdır: Bu işlemi biraz daha basit hale getirmek ve RxSwift bağımlılığını tek bir yere indirmek için, sadece bu adımları uygulayarak basit bir sınıf oluşturuyorum. Ateşleme mantığı sınıfın içindedir ve mantığı ayrı bir fonksiyona bölebilirsiniz.
RxSwift Bağımlılığı

RxSwift'i kullandıysanız, bu kod parçasını biliyorsunuzdur:

var taskChangeEvent = BehaviorSubject<Bool>()
...

if newValue != oldValue {
  subject.onNext(newValue)
}

...

taskChangeEvent.subscribe(onNext: { [weak self] done in
    ....
}).dispose(by: disposeBag)

Bu işlemi biraz daha basit hale getirmek ve RxSwift bağımlılığını tek bir yere indirgemek için, sadece bu adımları uygulayarak basit bir sınıf oluşturuyorum.

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
    }
}

Ateşleme mantığı sınıfın içindedir ve mantığı ayrı bir fonksiyona bölebilirsiniz.

Akışı dinlemek çok daha temiz ve kodun her yerinde bir disposeBag yok.

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)
}

BehaviorSubject kullanımına ilişkin bir yan not

Bildiğiniz gibi BehaviorSubject, dinlemeye başlayan son olayı yayınlar. Bu kurulum aşamasında sorun olabilir çünkü borularda su varken tesisat gibi olur. Henüz hazır değilken ziyaret ediliyorsunuz. Öte yandan, PublishSubject boruları birbirine bağlamanıza izin verir ve ardından olayları gönderir.

Bu nedenle, etkinlikleri almadan önce biraz hazırlık süresine ihtiyacınız varsa PublishSubject'i kullanmayı düşünün.