Ich lerne den Beispielcode in RxSwift. In der Datei GithubSignupViewModel1.swift ist die Definition von validatedUsername:Verwirrung über flatMapLatest in RxSwift
validatedUsername = input.username //the username is a textfiled.rx_text
.flatMapLatest { username -> Observable<ValidationResult> in
print("-------->1:")
return validationService.validateUsername(username)
.observeOn(MainScheduler.instance)
.catchErrorJustReturn(.Failed(message: "Error contacting server"))
}
.shareReplay(1)
die validateUsername Verfahren schließlich wird die folgende Methode genannt:
func usernameAvailable(username: String) -> Observable<Bool> {
// this is ofc just mock, but good enough
print("-------->2:")
let URL = NSURL(string: "https://github.com/\(username.URLEscaped)")!
let request = NSURLRequest(URL: URL)
return self.URLSession.rx_response(request)
.map { (maybeData, response) in
print("-------->3:")
return response.statusCode == 404
}
.catchErrorJustReturn(false)
}
Hier ist meine Verwirrung:
wenn ich Eingang ein Zeichen schnell in den Benutzernamen Textfeld, Nachricht --------> 1 :, --------> 2: zeigte, und etwas später Nachricht --------> 3: zeigte , aber zeigte nur eine --------> 3: Nachricht.
Wenn ich Zeichen langsamer eingegeben habe, wurde die Nachricht --------> 1 :, --------> 2 :, --------> 3: nacheinander angezeigt.
Aber wenn ich die FlatMapLatest in FlatMap ändern, wie viele Zeichen ich eingegeben habe, bekomme ich die gleiche Anzahl von --------> 3: Nachricht.
Wie funktioniert der flatMapLatest hier?
Wie die FlatMapLatest die frühe Antwort von NSURLResponse filtern?
Ich lese etwas über die FlatMapLatest, aber keiner von ihnen wird meine Verwirrung erklären.
Was ich sah, ist so etwas wie:
let a = Variable(XX)
a.asObservable().flatMapLatest(...)
Wenn a.value
auf eine andere Variable verändert, die Variable (XX) nicht dem Teilnehmer ein beeinflussen. Die input.username
wird nicht geändert, es ist immer eine testfield.rx_text
! Wie funktioniert das flatMapLatest?
der 'input.name' wird nicht geändert! Es gibt nur ein "Observable". Die Schließung in flatMapLatest jedes Mal aufgerufen, aber die Netzwerkanforderung nur einmal zurückgegeben. – leizh00701
Überprüfen Sie die Bearbeitung. – solidcell
Ich habe eine andere Erklärung über 'flatMapLatest' bekommen, und es hat meine Verwirrung gelöst. https://github.com/baconjs/bacon.js/wiki/Diagramme. Vielen Dank. – leizh00701