尝试使用RxSwift从ViewA
导航到ViewB
时遇到一个奇怪的问题。
我有以下代码(仅作为示例):
emailTextField.rx.text
.map { $0 ?? "" }
.bind(to: viewModel.email)
.disposed(by: bag)
viewModel.email
.asObservable()
.filter { $0.isValidEmail }
.subscribe(onNext: { value in
self.performSegue(withIdentifier: viewBSegue, sender: value)
})
.disposed(by: bag)
问题是,ViewB
出现后,我的subscribe
中的viewModel
被再次调用,这导致再次推动ViewB
。
email
中的 viewModel
变量是PublishSubject<String>
,我正在使用RxSwift
| RxCocoa 4.1
答案 0 :(得分:0)
在我看来,这似乎是RxCocoa中的错误,但也许我什么都没看到。 text
可观察到的(这是controlPropertyWithDefaultEvents
函数)在每一个编辑事件(包括editingDidEnd
)上发出。我希望它仅在editingChanged
或valueChanged
事件中发出。
也就是说,您可以使用.distinctUntilChanged()
运算符删除重复的发射。
在用户输入有效电子邮件后立即显示其他VC似乎有点奇怪。例如,请注意,“ foo@bar.co”是有效的电子邮件,但是如果我的电子邮件是“ foo@bar.com”,则在新的VC出现之前,我将无法输入全部内容。
其他一些评论:
在拥有.map { $0 ?? "" }
的地方,有一个.orEmpty
运算符可以执行相同的操作。
您在订阅中捕获了强大的自我,这意味着您的VC将永远无法从RAM中删除。除非您的VC是第一个。
表演中的sender
不应是用户的电子邮件。应该是发送消息的对象,在这种情况下,就是self
。
答案 1 :(得分:0)
您可以添加.distinctUntilChanged()
,以便所有没有更改的事件都将被过滤。