Uczę się kodu przykładowego w RxSwift. W pliku GithubSignupViewModel1.swift definicja validatedUsername jest:Zamieszanie na temat flatMapLatest w 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)
metoda validateUsername w końcu nazywa się następującą metodę:
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)
}
Oto mój zamieszanie:
ilekroć wprowadzisz szybko znak w polu tekstowym nazwy użytkownika, wiadomość --------> 1 :, --------> 2: pokazana, a nieco później wiadomość --------> 3: pokazana , ale pokazał tylko jedną --------> 3: wiadomość.
Gdy wprowadzam znaki wolniej, komunikat --------> 1 :, --------> 2 :, --------> 3: wyświetlany kolejno.
Ale kiedy zmienię flatMapLatest na flatMap, ile znaków wprowadzę, otrzymam taką samą liczbę --------> 3: wiadomość.
Jak działał tutaj flatMapLatest?
W jaki sposób flatMapLatest filtruje wczesną odpowiedź z NSURLResponse?
Przeczytałem trochę o flatMapLatest, ale żaden z nich nie wyjaśni mojego zamieszania.
Co widziałem coś takiego jak:
let a = Variable(XX)
a.asObservable().flatMapLatest(...)
Kiedy zmienił a.value
do innej zmiennej, zmiennej (XX) nie wpłynie na abonent.
Ale input.username
nie jest zmieniany, zawsze jest to testfield.rx_text
! Więc jak działa flatMapLatest?
"nazwa wejściowa" nie została zmieniona! Jest tylko jeden "obserwowalny". Zamknięcie w flatMapLatest wywołane za każdym razem, ale żądanie sieciowe zwrócone tylko raz. – leizh00701
Sprawdź edycję. – solidcell
Mam inne wyjaśnienie na temat 'flatMapLatest', i to rozwiązało moje zamieszanie. https://github.com/baconjs/bacon.js/wiki/Diagrams. Dziękuję Ci. – leizh00701