【问题标题】:Observing multiple controlEvent causes `Reentrancy anomaly was detected.` warning message观察多个 controlEvent 导致“检测到可重入异常。”警告消息
【发布时间】:2018-06-23 14:47:03
【问题描述】:

我是 RxSwift 的新手,今天我遇到了一个我无法解决的问题。我想在UITextField中观察controlEvents。

代码:

textField.rx
    .controlEvent([.editingDidEndOnExit, .editingDidEnd])
    .subscribe(onNext: { [weak self] in
        // do stuff
    })
    .disposed(by: disposeBag)

textField 辞职成为第一响应者或用户点击return 按钮时,我想现在。当我执行一行代码时代码工作正常:textField.resignFirstResponder() 但是当我点击 return 按钮时,我收到一条警告消息:

⚠️ 检测到重入异常。 调试:要调试此问题,您可以在 /Users/laxmorek/Documents/projects/meetingapplication-ios/Pods/RxSwift/RxSwift/Rx.swift:97 中设置断点并观察调用堆栈。 问题:这种行为破坏了可观察序列语法。 next (error | completed)? 这种行为破坏了语法,因为序列事件之间存在重叠。 可观察序列试图在前一个事件的发送完成之前发送一个事件。 解释:这可能意味着你的代码中存在某种意想不到的循环依赖, 或者系统未按预期方式运行。 补救措施:如果这是预期的行为,可以通过添加.observeOn(MainScheduler.asyncInstance) 来抑制此消息 或以其他方式将序列事件加入队列。

我不明白这一点。

  • RxSwift 中观察多个controlEvent 的正确方法是什么?
  • 为什么我会收到此警告消息?我的观察设置有什么问题?

编辑

临时解决方法是我这样拆分我的代码:

textField.rx
    .controlEvent(.editingDidEndOnExit)
    .subscribe(onNext: { [weak self] in
        self?.isSelected = false
    })
    .disposed(by: disposeBag)
textField.rx
    .controlEvent(.editingDidEnd)
    .subscribe(onNext: { [weak self] in
        self?.isSelected = false
    })
    .disposed(by: disposeBag)

但是这个代码重复看起来不太好。 :/

【问题讨论】:

    标签: ios swift rx-swift rx-cocoa


    【解决方案1】:

    这意味着事件是从不同的线程发送的。通过指定 MainScheduler.asyncInstance,您可以指定事件与 MainScheduler.asyncInstance 线程一起发送,这将避免 onNext 事件的并发问题。

    试试这个:

    textField.rx
        .controlEvent([.editingDidEndOnExit, .editingDidEnd])
        .observeOn(MainScheduler.asyncInstance)
        .subscribe(onNext: { [weak self] in
            // do stuff
        })
        .disposed(by: disposeBag)
    

    【讨论】:

    • 能否详细说明“事件是从不同的线程发送的”?这些事件不会在主线程上生成吗?如果是这样,使用 .asyncInstance 有什么帮助?干杯。
    猜你喜欢
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    相关资源
    最近更新 更多