gpt4 book ai didi

swift - FlatMapLatest 跳过触发,直到最新的可观察完成

转载 作者:行者123 更新时间:2023-11-30 10:47:32 25 4
gpt4 key购买 nike

我正在尝试编写代码,对特定用户操作执行某种可失败的长时间运行的请求,但在请求处于事件状态时忽略悲伤的操作。目标是只要请求没有成功发出,就允许点击按钮。所有错误都会被跳过。到目前为止,我编写了这样的代码,但不知道下一步该做什么:

struct ErrorError: Error {}
var emitSuccess: Bool = false

// should be something like button.rx.tap
let buttonTap = PublishSubject<Void>()

let requestDuration: RxTimeInterval = 5
let tapInterval: RxTimeInterval = 3


let requestTrigger = buttonTap
// ???
.flatMapLatest { (_) -> Observable<Bool> in
// imitation of http request/parsing etc.
if emitSuccess {
return Observable.just(true)
.delay(requestDuration, scheduler: MainScheduler.instance)
.debug("response success", trimOutput: false)
} else {
emitSuccess = true
return Observable.error(ErrorError())
.materialize()
.delay(requestDuration, scheduler: MainScheduler.instance)
.dematerialize()
.debug("response failure", trimOutput: false)
.catchErrorJustComplete()
}
}
.take(1) //supposed to dispose observation of taps
.share(replay: 1, scope: .forever)

let requestResponse = requestTrigger
.debug("response", trimOutput: false)
.subscribe()

// imitate button tap
Observable<Int>.interval(tapInterval, scheduler: MainScheduler.instance)
.takeUntil(Observable.just(true).delay(20, scheduler: MainScheduler.instance))
.debug("button tap imitation", trimOutput: false)
.subscribe(onNext: { (value) in
buttonTap.onNext(())
return
})

在当前的形式中,每次点击都会处理未完成的可观察对象并开始一个新的可观察对象,这是不可取的。 “???”我认为应该是一些聪明的节流/跳过运算符(operator)的地方。

想到的事情:

  • 替换“???”使用 takeUntil(requestResponse) 这将导致某种奇怪的递归订阅(甚至是允许/好的/坏的做法?)
  • 使用concatMap而不是flatMapLatest,但它会排队点击,在这种情况下,如果发生一些错误(例如没有互联网连接),它可能会发生在所有排队的情况下taps->requests,这意味着我需要跳过点击
  • 创建我自己的 Observable(使用 createdeferred 等)

最佳答案

可能会感到羞耻,因为事实证明这个问题的答案是表面上的 - 我应该只使用 flatMapFirst。据我所知,许多 rx 运算符都有不明显的含义和用例,习惯它们的最佳方法是练习和阅读。

顺便说一句this nice post尽管重复的文档仍然对我来说稍微好一些,并且正是我在写下这个问题(捂脸)后10分钟后读到的内容(尽管我可以只阅读所有运算符的文档,最终找到我需要的)。

关于swift - FlatMapLatest 跳过触发,直到最新的可观察完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55459969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com