繁体   English   中英

RXSwift,检测到折返异常

[英]RXSwift, Reentrancy anomaly was detected

我是RXSwift的初学者,我的代码有问题

我有代码:

let dartScore = PublishSubject<Int>()
            dartScore.asObservable()
                .scan(501) { intermediate, newValue in
                    let result = intermediate - newValue
                    return result >= 0 ? result : intermediate
                }
                .do(onNext: {
                    if $0 == 0 {
                        dartScore.onCompleted()
                    }
                })
                .subscribe({
                    print($0.isStopEvent ? $0 : $0.element!)
                })
                .disposed(by: disposeBag)

            dartScore.onNext(13)
            dartScore.onNext(50)
            dartScore.onNext(60)
            dartScore.onNext(378)

我得到错误:

⚠️重新进入异常被检测到。 ⚠️

调试:要调试此问题,可以在/****RxSwift/RxSwift/Rx.swift:97中设置断点,并观察调用堆栈。

问题:此行为破坏了可观察的序列语法。 next (error | completed)? 此行为破坏了语法,因为序列事件之间存在重叠。 可观察到的序列正在尝试发送事件,而先前事件的发送尚未完成。

为什么我不能在.do(onNext)内执行“ .onCompleted()”,我应该怎么做以避免警告?

我正在使用XCode 9.0,Swift 4,RXSwift 4.0.0

谢谢

最好的祝福

您无法在.onCompleted()内部执行.onNext()因为在这种情况下,您将拥有可观察到的吞噬自己的尾巴的功能。 这也会导致一个存储周期。

就像注释中建议的@Enigmativity一样,您应该使用takeWhile()处理这种情况:

dartScore.asObservable()
    .scan(501) { intermediate, newValue in
        let result = intermediate - newValue
        return result >= 0 ? result : intermediate
    }
    .takeWhile { $0 != 0 }
    .subscribe({
        print($0.isStopEvent ? $0 : $0.element!)
    })

上面的代码产生了一个新的observable,当该值为0时完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM