【问题标题】:RxSwift: implementing concatMap generating Reentrancy anomaly was detected errorRxSwift:实现 concatMap 生成可重入异常被检测到错误
【发布时间】:2019-12-07 20:09:00
【问题描述】:

我正在尝试在RxSwift 中实现concatMap,但是当我尝试为concatMap 中的可观察对象设置一个新值时,我收到了这个错误:

Reentrancy anomaly was detected.
  > Debugging: To debug this issue you can set a breakpoint in /Users/SuperUser/repos/RxObserver/Pods/RxSwift/RxSwift/Rx.swift:96 and observe the call stack.
  > Problem: This behavior is breaking the observable sequence grammar. `next (error | completed)?`
    This behavior breaks the grammar because there is overlapping between sequence events.
    Observable sequence is trying to send an event before sending of previous event has finished.
  > Interpretation: This could mean that there is some kind of unexpected cyclic dependency in your code,
    or that the system is not behaving in the expected way.
  > Remedy: If this is the expected behavior this message can be suppressed by adding `.observeOn(MainScheduler.asyncInstance)`
    or by enqueuing sequence events in some other way.

这是我的代码:

public let myNumbers = BehaviorRelay<String>(value: "")

override func viewDidLoad() {
    super.viewDidLoad()
    processNumbers()
    myNumbers.accept("one")
    myNumbers.accept("two")
}

func processNumbers() {
    Observable.of(myNumbers).concatMap{ $0
    }.subscribe(onNext:{
        print($0)
        if $0 == "one" || $0 == "two"{
            self.myNumbers.accept("YEAH!")
        }
        }).disposed(by: disposeBag)

}

你们中的任何人都知道我为什么会收到此错误或如何更改我的实现以避免收到此错误/警告?

非常感谢您的帮助。

【问题讨论】:

    标签: rx-swift xcode11.2 concatmap ios13.2 swift5.2


    【解决方案1】:

    你们中的任何人都知道我为什么会收到这个错误吗?

      > Problem: This behavior is breaking the observable sequence grammar. `next (error | completed)?`
        This behavior breaks the grammar because there is overlapping between sequence events.
        Observable sequence is trying to send an event before sending of previous event has finished.
    

    如何更改我的实现以避免出现此错误/警告?

      > Remedy: If this is the expected behavior this message can be suppressed by adding `.observeOn(MainScheduler.asyncInstance)`
        or by enqueuing sequence events in some other way.
    

    【讨论】:

      【解决方案2】:

      我找到了解决此问题的方法:

      func processNumbers() {
              Observable.of(myNumbers).concatMap{ $0
              }
              .observeOn(MainScheduler.asyncInstance)
              .subscribe(onNext:{
                  print($0)
                  if $0 == "one" || $0 == "two"{
                      self.myNumbers.accept("YEAH!")
                  }
                  }).disposed(by: disposeBag)
      
          }
      

      通过添加这行代码.observeOn(MainScheduler.asyncInstance),错误/警告消失了!!

      【讨论】:

        猜你喜欢
        • 2018-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-27
        • 2016-02-21
        • 2016-09-11
        • 1970-01-01
        相关资源
        最近更新 更多