关于RxSwift中最新版本FlatMap的困惑

关于RxSwift中最新版本FlatMap的困惑,swift,functional-programming,reactive-cocoa,rx-swift,Swift,Functional Programming,Reactive Cocoa,Rx Swift,我在RxSwift中学习了示例代码。在文件GithubSignupViewModel1.swift中,ValidateUserName的定义为: validatedUsername = input.username //the username is a textfiled.rx_text .flatMapLatest { username -> Observable<ValidationResult> in print("-------->1:"

我在RxSwift中学习了示例代码。在文件GithubSignupViewModel1.swift中,ValidateUserName的定义为:

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)
当将
a.value
更改为另一个变量时,变量(XX)不会影响a.value的订户


但是,
input.username
没有更改,它始终是一个
testfield.rx\u text
!那么FlatMap最新的工作原理是什么呢?

不清楚您的困惑是什么。您是否在质疑
flatMap
flatMapLatest
之间的区别
flatMap
将映射到一个新的
Observable
,如果它需要再次映射
flatMap
,它本质上会将两个映射的
Observable
合并为一个。如果它需要再次
flatMap
,它将再次合并它,以此类推

使用
flatMapLatest
,当映射一个新的
可观察的
时,它会覆盖上一个
可观察的
(如果有)。没有合并

编辑:
作为对您评论的回应,您没有看到任何
”------>3:“
打印的原因是那些
rx\u请求
可观察的
在它们能够竞争之前就被处理掉了,因为
flatMapLatest
接收到了一个新元素,并且该元素映射到了一个新的
可观察的
。处理后,
rx\u request
可能会取消请求,并且不会在打印位置运行回调。旧的
可观察的
被丢弃,因为当新的
取而代之时,它不再属于任何人。

DroidSondroid的答案对我来说很清楚:

flatMap()获取一个值,然后执行长任务,当 获取下一个值,即使新的 值到达当前任务的中间。这不是真的什么 我们需要,因为当我们在搜索栏中获得新文本时,我们希望 取消上一个请求并启动另一个请求。那是什么 flatMapLatest()可以

您可以使用Appstore上的RxMarbles应用程序与运营商一起玩。

我发现这很有用

将可观测序列发射的元素转换为可观测序列,并将两个可观测序列的发射合并为单个可观测序列例如,当您有一个可观测序列本身发射可观测序列,并且您希望能够对任一可观测序列的新发射作出反应时,这也很有用。flatMap和flatMapLatest之间的区别在于,flatMapLatest将仅从最近的内部可观察序列发射元素

let dispebag=dispebag()
结构播放器{
var分数:可变
}
我想这张图表会有所帮助


输入的
名称未更改!只有一个
是可观察的
。flatMapLatest中的闭包每次都会调用,但网络请求只返回一次。我得到了另一个关于
flatMapLatest
的解释,它解决了我的困惑。非常感谢。
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)
}
let a = Variable(XX)
a.asObservable().flatMapLatest(...)