检测到RXSwift,Reentrancy异常

时间:2017-12-03 03:42:21

标签: swift xcode system.reactive rx-swift

我是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

谢谢

最好的问候

1 个答案:

答案 0 :(得分:5)

你不能在.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时完成。