Я изучаю пример кода в RxSwift. В файле GithubSignupViewModel1.swift, определение validatedUsername является:Путаница о flatMapLatest в 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)
метод validateUsername Наконец вызывается следующий метод:
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)
}
Вот моя путаница:
всякий раз, когда я ввести символ быстро в текстовом поле имени пользователя, сообщение --------> 1 :, --------> 2: показано, а чуть позже сообщение --------> 3: показано , но показал только одно сообщение --------> 3:.
Когда я вводим символы медленнее, сообщение --------> 1 :, --------> 2 :, --------> 3: показано последовательно.
Но когда я изменяю flatMapLatest на flatMap, сколько символов я ввожу, я получу то же количество сообщений --------> 3:.
А как работает flatMapLatest?
Как flatMapLatest фильтрует ранний отклик от NSURLResponse?
Я читал некоторые о flatMapLatest, но никто из них не объяснит мое замешательство.
То, что я увидел что-то вроде:
let a = Variable(XX)
a.asObservable().flatMapLatest(...)
a.value
При изменении в другой переменной, то переменная (XX) не будет влиять на абоненту.
Но input.username
не изменяется, это всегда testfield.rx_text
! Итак, как работает flatMapLatest?
'input.name' не изменен! Есть только один «Наблюдаемый». Закрытие в flatMapLatest вызывалось каждый раз, но сетевой запрос возвращался только один раз. – leizh00701
Проверьте изменения. – solidcell
У меня появилось другое объяснение о 'flatMapLatest', и это решило мое замешательство. https://github.com/baconjs/bacon.js/wiki/Diagrams. Спасибо. – leizh00701