簡體   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