代码之家  ›  专栏  ›  技术社区  ›  Seishin Okigaru

RXSwift,检测到重入异常

  •  9
  • Seishin Okigaru  · 技术社区  · 6 年前

    我是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)? 这种行为破坏了语法,因为序列事件之间存在重叠。 可观察序列是在前一个事件的发送完成之前尝试发送一个事件。

    为什么我不能在里面做“.onCompleted()”。do(onNext),我应该做什么来避免警告?

    我使用的是XCode 9.0、swift 4、RXSwift 4.0.0

    非常感谢。

    顺致敬意,

    2 回复  |  直到 6 年前
        1
  •  12
  •   Daniel T.    6 年前

    你做不到 .onCompleted() 内部 .onNext() 因为在这种情况下,可以观察到的物体会吃掉自己的尾巴。这也会导致内存循环。

    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!)
        })
    

    上面生成了一个新的可观察值,该值为0时完成。

        2
  •  0
  •   TheEye    3 年前

    与OP的问题没有直接联系,但我是在搜索时来到这里的 Reentrancy anomaly was detected 对我来说,原因很简单,我删除了一个 addSubview(viewInQuestion) 在MacOs上的NSView代码行中,同时仍使用 viewInQuestion 在约束设置中。。。添加 查看问题 作为子视图解决了这个问题。