观察到多个controlEvent会导致“检测到重新进入异常。”警告消息

时间:2018-06-23 14:47:03

标签: ios swift rx-swift rx-cocoa

我是RxSwift的新手,今天我面临一个无法解决的问题。我想观察controlEvent中的UITextField个。

代码:

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)来抑制此消息。       或通过其他方式使序列事件入队。

我不明白。

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

编辑

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

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)

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

1 个答案:

答案 0 :(得分:0)

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

尝试一下:

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