【发布时间】:2016-09-24 03:58:23
【问题描述】:
我在 RxSwift 中学习示例代码。在 GithubSignupViewModel1.swift 文件中,validatedUsername 的定义是:
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)不会影响a的订阅者。
但是input.username 没有改变,它始终是testfield.rx_text!那么 flatMapLatest 是如何工作的呢?
【问题讨论】:
标签: swift functional-programming reactive-cocoa rx-swift