关于RxSwift中flatMapLatest的困惑

我在Rx Swift中学习了示例代码.在文件 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:message.

那么flatMapLatest如何在这里工作呢?

flatMapLatest如何过滤NSURLResponse的早期响应?

我读了一些关于flatMapLatest的内容,但没有一个能解释我的困惑.

我看到的是:

let a = Variable(XX)
a.asObservable().flatMapLatest(...)

将a.value更改为另一个变量时,变量(XX)不会影响a的用户.

但是input.username没有改变,它总是一个testfield.rx_text!那么flatMapLatest如何工作呢?

目前尚不清楚你的困惑是什么.你在质疑flatMap和flatMapLatest之间的区别吗? flatMap将映射到一个新的Observable,如果它再次需要flatMap,它实际上将两个映射的Observable合并为一个.如果它再次需要flatMap,它将再次合并,等等.

使用flatMapLatest,当映射一个新的Observable时,它会覆盖最后一个Observable(如果有的话).没有合并.

编辑:在回复你的评论时,你没有看到任何“——> 3:”打印的原因是因为那些rx_request Observables在它们可以竞争之前被处理掉了,因为flatMapLatest接收了一个新元素,并且这映射到一个新的Observable.处理完毕后,rx_request可能会取消请求,并且不会在您打印的地方运行回调.旧Observable被处置,因为当新的Observable取而代之时它不再属于任何人.

相关文章
相关标签/搜索