我是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)


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

最佳答案

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

尝试这个:

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

关于ios - 观察到多个controlEvent会导致“检测到重新进入异常”警告消息。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51002262/

10-16 11:47