मैं आरएक्सस्विफ्ट के साथ बहुत शुरुआत कर रहा हूं और मैं एक साधारण लॉगिन स्क्रीन से शुरू करने की कोशिश कर रहा हूं। तो मेरे पास 2 टेक्स्ट फ़ील्ड और एक लॉगिन बटन है, जो PublishSubject
से जुड़ा हुआ है, इसलिए हर बार जब मैं बटन टैप करता हूं, तो मैं प्रमाणीकरण करने के लिए एक नेटवर्क अनुरोध भेजूंगा।आरएक्सस्विफ्ट - कुछ अवधारणा को गलत तरीके से
चूंकि प्रमाणीकरण विफल हो सकता है, इसलिए मैं Driver
के साथ गया, इसलिए जब भी मैं बटन क्लिक करता हूं तो मैं अपना अनुरोध दोबारा चला सकता हूं।
मेरे पास 2 संस्करण है जो मुझे लगता है कि एक ही कोड है लेकिन एक काम करता है और कोई नहीं करता है। मैं समझने की कोशिश कर रहा हूं कि दृश्य के पीछे क्या होता है।
यहाँ पहले संस्करण जो काम करता है (अनुरोध हर बार जब मैं बटन को स्पर्श करें):
let credentials = Observable.combineLatest(email.asObservable(), password.asObservable()) { ($0, $1) }
self.signIn = signInTaps.asObservable()
.withLatestFrom(c)
.flatMapLatest { email, password in // returns Observable<AuthenticateResponse>
return provider.request(.Authenticate(email: email, password: password))
.filterSuccessfulStatusCodes()
.mapObject(AuthenticateResponse)
}
.map { element -> Result<AuthenticateResponse, APIError> in // returns Observable<Result<AuthenticateResponse, APIError>>
return .Success(element)
}
.asDriver { error in // returns Driver<Result<AuthenticateResponse, APIError>>
let e = APIError.fromError(error)
return Driver<Result<AuthenticateResponse, APIError>>.just(.Failure(e))
}
.debug()
:
let credentials = Driver.combineLatest(email.asDriver(), password.asDriver()) { ($0, $1) }
self.signIn = signInTaps
.asDriver(onErrorJustReturn:())
.withLatestFrom(credentials)
.flatMapLatest { email, password in // returns Driver<Result<AuthenticateResponse, APIError>>
return provider.request(.Authenticate(email: email, password: password))
.filterSuccessfulStatusCodes()
.mapObject(AuthenticateResponse)
.map { element -> Result<AuthenticateResponse, APIError> in
return .Success(element)
}
.asDriver { error in
let e = APIError.fromError(error)
return Driver<Result<AuthenticateResponse, APIError>>.just(.Failure(e))
}
.debug()
}
और यहाँ एक जो (केवल प्रथम क्लिक पर अनुरोध आग) काम नहीं करता है
जानकारी के लिए यहाँ मेरी गुण घोषणा है:
let email = Variable("")
let password = Variable("")
let signInTaps = PublishSubject<Void>()
let signIn: Driver<Result<AuthenticateResponse, APIError>>
'flatMap' बनाम 'flatMapLatest' https://github.com/baconjs/bacon.js/wiki/Diagrams – onmyway133