我是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)
但是此代码重复看起来不太好。 :/
答案 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)