Apprendimento del codice di esempio in RxSwift. Nel file GithubSignupViewModel1.swift, la definizione di validatedUsername è:Confusione su 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)
il metodo validateUsername viene finalmente chiamato il seguente metodo:
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)
}
Ecco la mia confusione:
ogni volta che un ingresso carattere rapidamente nel campo di testo username, messaggio --------> 1 :, --------> 2: mostrato, e un messaggio poco successivo --------> 3: mostrato , ma ha mostrato solo uno --------> 3: messaggio.
Quando inserisco i caratteri più lentamente, messaggio --------> 1 :, --------> 2 :, --------> 3: mostrato successivamente.
Ma quando cambio flatMapLatest in flatMap, quanti caratteri immetto, otterrò lo stesso numero di --------> 3: message.
Quindi, come ha funzionato flatMapLatest qui?
In che modo flatMapLatest filtra la risposta anticipata da NSURLResponse?
Ho letto alcuni su flatMapLatest, ma nessuno di loro spiegherà la mia confusione.
Quello che ho visto è qualcosa di simile:
let a = Variable(XX)
a.asObservable().flatMapLatest(...)
Quando cambiato a.value
a un'altra variabile, la variabile (XX) non influenzerà l'abbonato di una.
Ma lo input.username
non viene modificato, è sempre un testfield.rx_text
! Quindi, come funziona flatMapLatest?
"input.name" non è stato modificato! C'è solo un 'Osservabile'. La chiusura in flatMapLatest veniva richiamata ogni volta, ma la richiesta di rete veniva restituita solo una volta. – leizh00701
Controlla la modifica. – solidcell
Ho avuto un'altra spiegazione su 'flatMapLatest', e ha risolto la mia confusione. https://github.com/baconjs/bacon.js/wiki/Diagrams. Grazie. – leizh00701