关于RxSwift中最新版本FlatMap的困惑
我在RxSwift中学习了示例代码。在文件GithubSignupViewModel1.swift中,ValidateUserName的定义为:关于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:"
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(...)