ReactiveCocoa:仅订阅新值

Jas*_*ues 12 cocoa objective-c ios reactive-cocoa

我在viewDidLoad中创建了一个事件订阅者,如下所示:

[RACObserve(_authenticationView.passwordInput.textField, text) subscribeNext:^(NSString* text)
{
     //handle this
}];
Run Code Online (Sandbox Code Playgroud)

只要textField.text属性发生更改(预期),它就会触发,但是它在创建时也会触发一次,或者触发初始值,这不是我想要的.

当然我可以过滤掉它,但我只想过滤掉第一个事件.我该怎么做呢?

要求:

  • 如果密码具有新的空值,则显示验证消息(无法将密码设置为空).
  • 如果密码具有新的非空值,请与远程客户端通信.

..那么最干净的方法是什么?

jos*_*ber 21

如果你只是想跳过第一个值,只需坚持一下-skip:1:

[[RACObserve(_authenticationView.passwordInput.textField, text) skip:1] subscribeNext:^(NSString* text)
{
     //handle this
}];
Run Code Online (Sandbox Code Playgroud)

  • ......这是规范的方法,在2.0迁移指南中建议:https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/CHANGELOG.md ...你也是ReactiveCocoa的核心贡献者,所以你已经知道了...... (2认同)

Vas*_*mov 1

您可以使用不同的方法:

  1. -skip:1跳过第一个值。
[[RACObserve(_authenticationView.passwordInput.textField, text) skip:1] subscribeNext:^(NSString* text) {
    //handle this
}];
Run Code Online (Sandbox Code Playgroud)
  1. -ignore:nil跳过初始零值。
[[RACObserve(_authenticationView.passwordInput.textField, text) ignore:nil] subscribeNext:^(NSString* text) {
    //handle this
}];
Run Code Online (Sandbox Code Playgroud)
  1. -distinctUntilChanged跳过与先前相同的新值。
[[RACObserve(_authenticationView.passwordInput.textField, text) distinctUntilChanged] subscribeNext:^(NSString* text) {
    //handle this
}];
Run Code Online (Sandbox Code Playgroud)