RxSwift 在推送另一个视图后绑定到下一个发送的 textField

RxSwift bind on textField sending next after pushing another view

我在尝试使用 RxSwift 从 ViewA 导航到 ViewB 时遇到了一个奇怪的问题。

我有以下代码(这只是一个例子):

    emailTextField.rx.text
        .map { [=10=] ?? "" }
        .bind(to: viewModel.email)
        .disposed(by: bag)


    viewModel.email
        .asObservable()
        .filter { [=10=].isValidEmail }
        .subscribe(onNext: { value in
            self.performSegue(withIdentifier: viewBSegue, sender: value)
        })
        .disposed(by: bag)

问题是,在 ViewB 出现后,我的 viewModel 中的 subscribe 再次被调用,导致再次推送 ViewB

email viewModel 中的变量是 PublishSubject<String> 而我正在使用 RxSwift|RxCocoa 4.1

对我来说,这看起来像是 RxCocoa 中的一个错误,但也许我没有看到什么。 text 可观察对象(它是一个 controlPropertyWithDefaultEvents 函数)在 每个 编辑事件(包括 editingDidEnd)上发出。我原以为它只会在 editingChangedvalueChanged 事件上发出。

也就是说,您可以只使用 .distinctUntilChanged() 运算符来删除重复的发射。

在用户输入有效电子邮件后,您会立即显示不同的 VC,这似乎有点奇怪。请注意,例如 "foo@bar.co" 是一个有效的电子邮件,但如果我的电子邮件是 "foo@bar.com",我将无法在新的 VC 出现之前输入全部内容。

其他一些评论:

在你有 .map { [=16=] ?? "" } 的地方,有一个 .orEmpty 运算符可以做同样的事情。

您在订阅中捕捉到了强大的自我,这意味着您的 VC 将永远无法从 RAM 中删除。除非你的VC是第一个。

你的 perform segue 中的 sender 不应该是用户的电子邮件。它应该是发送消息的对象,在这种情况下换句话说 self

您可以添加 .distinctUntilChanged() 以便过滤任何没有更改的事件。