RxSwift निर्भरता

May 02 2023
यदि आपने RxSwift का उपयोग किया है तो आप कोड के इस स्निपेट से परिचित हैं: इस प्रक्रिया को थोड़ा सरल बनाने के लिए और RxSwift निर्भरता को एक ही स्थान पर कम करने के लिए, मैं इन चरणों को करते हुए एक साधारण वर्ग का निर्माण करता हूँ। फायरिंग का लॉजिक क्लास के अंदर है और आप लॉजिक को एक अलग फंक्शन में विभाजित कर सकते हैं।
RxSwift निर्भरता

यदि आपने RxSwift का उपयोग किया है तो आप कोड के इस स्निपेट से परिचित हैं:

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

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

...

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

इस प्रक्रिया को थोड़ा सरल बनाने और RxSwift निर्भरता को एक ही स्थान पर कम करने के लिए, मैं इन चरणों का पालन करते हुए एक साधारण वर्ग का निर्माण करता हूँ।

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

फायरिंग का लॉजिक क्लास के अंदर है और आप लॉजिक को एक अलग फंक्शन में विभाजित कर सकते हैं।

स्ट्रीम को सुनना ज्यादा साफ है और पूरे कोड में डिस्पोज़बैग नहीं है।

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

बिहेवियर सब्जेक्ट का उपयोग करने पर एक साइड नोट

जैसा कि आप जानते हैं बिहेवियर सब्जेक्ट आखिरी इवेंट जारी करता है जिसे सुनना शुरू करता है। सेटअप चरण के दौरान यह एक समस्या हो सकती है, क्योंकि पाइप में पानी होने पर यह प्लंबिंग की तरह है। जब आप अभी तक तैयार नहीं होते हैं तो आप का दौरा किया जाता है। दूसरी ओर, PublishSubject आपको पाइपों को एक साथ जोड़ने देता है और फिर ईवेंट भेजता है।

इसलिए यदि आपको ईवेंट प्राप्त करने से पहले तैयारी के लिए कुछ समय चाहिए तो PublishSubject का उपयोग करने पर विचार करें।