RxSwift绑定textField并在推送另一个视图后发送

时间:2018-08-15 18:35:02

标签: ios swift rx-swift

尝试使用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

2 个答案:

答案 0 :(得分:0)

在我看来,这似乎是RxCocoa中的错误,但也许我什么都没看到。 text可观察到的(这是controlPropertyWithDefaultEvents函数)在每一个编辑事件(包括editingDidEnd)上发出。我希望它仅在editingChangedvalueChanged事件中发出。

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

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

其他一些评论:

在拥有.map { $0 ?? "" }的地方,有一个.orEmpty运算符可以执行相同的操作。

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

表演中的sender不应是用户的电子邮件。应该是发送消息的对象,在这种情况下,就是self

答案 1 :(得分:0)

您可以添加.distinctUntilChanged(),以便所有没有更改的事件都将被过滤。