【问题标题】:How to suppress a specify error in RxSwift?如何抑制 RxSwift 中的指定错误?
【发布时间】:2017-04-18 05:36:14
【问题描述】:

在调试方案中运行时,如果您的代码是这样的,第 30 行会出现致命错误。

https://github.com/ReactiveX/RxSwift/blob/master/RxSwift/Observables/Implementations/Sink.swift

rxFatalError("Warning: Recursive call or synchronization error!")

如果我选择从 Debug 到 Release 的运行方案。致命错误不会显示。但我想知道我是否可以做点什么来抑制它。

class ViewController4: UIViewController {
    var v = Variable(0)
    var disposeBag = DisposeBag()
    var notiBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        v.asObservable()
            .subscribe(onNext: { _ in
                let noti = Notification(name: MyNotificationName)
                NotificationCenter.default.post(noti)
            })
            .disposed(by: disposeBag)

        NotificationCenter.default.rx.notification(MyNotificationName)
            .subscribe(onNext: { [unowned self] _ in
                if self.v.value == 10 { self.notiBag = DisposeBag() }
                else { self.v.value += 1 } // this line cause the issue
                print(self.v.value)
                self.counterTextView.text! += "\(self.v.value)\n"
            })
            .disposed(by: notiBag)
        v.value = 0
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBOutlet weak var counterTextView: UITextView!
}

let MyNotificationName = Notification.Name.init(rawValue: "My Notification Name")

【问题讨论】:

  • 您的代码似乎正在监听通知MyNotificationName,然后转发了10 次?这真的是你想要的吗?

标签: fatal-error rx-swift suppress


【解决方案1】:

此致命错误仅在调试模式下出现,因为它仅在您为调试而编译时调用 rxFataError。它的定义是这样的:

#if DEBUG
    if AtomicIncrement(&_numberOfConcurrentCalls) > 1 {
        rxFatalError("Warning: Recursive call or synchronization error!")
    }

    defer {
        _ = AtomicDecrement(&_numberOfConcurrentCalls)
    }
#endif

我刚刚在 RxSwift 更新 (3.4.0) 后遇到了这个致命错误。我的代码更新了并发队列中的变量值。更改为串行队列修复了此崩溃。

蒂埃里

【讨论】:

    【解决方案2】:

    我已将@thierryb 的答案标记为正确答案。已知正确答案如下。

    NotificationCenter.default.rx.notification(MyNotificationName)
        .observeOn(MainScheduler.asyncInstance)
        .subscribe(onNext: { [unowned self] _ in
            if self.v.value == 10 { self.notiBag = DisposeBag() }
            else { self.v.value += 1 } // this line cause the issue
            print(self.v.value)
            self.counterTextView.text! += "\(self.v.value)\n"
        })
        .disposed(by: notiBag)
    

    NotificationCenter.default.rx.notification(MyNotificationName)
        .subscribe(onNext: { [unowned self] _ in
            DispatchQueue.main.async { [unowned self] in
                if self.v.value == 10 { self.notiBag = DisposeBag() }
                else { self.v.value += 1 } // this line cause the issue
                print(self.v.value)
                self.counterTextView.text! += "\(self.v.value)\n"
            }
        })
        .disposed(by: notiBag)
    

    【讨论】:

      【解决方案3】:

      您可以在不使用Variable 的情况下获得相同的行为。

          let scheduler = SerialDispatchQueueScheduler(qos: .userInitiated)
          NotificationCenter.default.rx.notification(MyNotificationName)
              .take(9)
              .observeOn(scheduler)
              .subscribe(onNext: { _ in
                  let noti = Notification(name: MyNotificationName)
                  print("foo")
                  NotificationCenter.default.post(noti)
              }).disposed(by: bag)
      
          let noti = Notification(name: MyNotificationName)
          NotificationCenter.default.post(noti)
      

      【讨论】:

      • 你能仔细检查你的答案吗?我试过了,还是不行。
      • 在此上下文中定义“工作”。你想做什么?
      • 我的代码不可能触发致命错误,它甚至没有使用 Sink 类。我再次问,你想做什么?我严重怀疑你只是想把 1 到 10 放在 textView 中,我也不认为你想发送 10 个相同的通知......
      • 只需在代码块后面添加 'NotificationCenter.default.post(noti)' 新行以手动触发通知,您将在块中的 'post' 行收到致命错误。您自己没有遇到致命错误,因为您的代码块以前从未运行过。
      • 感谢@OwenZhao。我已更新我的答案以避免错误。
      猜你喜欢
      • 2017-03-02
      • 2022-07-05
      • 2020-11-12
      • 1970-01-01
      • 2023-03-19
      • 2012-03-24
      • 2012-10-29
      • 2011-02-11
      • 2013-02-12
      相关资源
      最近更新 更多