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