通过RACSignal以多种方式设置按钮的启用属性?

时间:2013-12-16 04:52:14

标签: ios objective-c reactive-programming reactive-cocoa

我是Reactive Cocoa的新手。我正在尝试通过信号设置按钮启用属性。 我有以下代码片段可以正常工作:

RACSignal *formValid = [RACSignal
                        combineLatest:@[username.rac_textSignal, password.rac_textSignal, confirmPassword.rac_textSignal]
                        reduce:^(NSString *username, NSString *password, NSString *passwordVerification) {
                                return @([username length] > 0 && [password length] > 3 && [password isEqual:passwordVerification]);
                        }];

RAC(signUp,enabled) = formValid;

但是,我也遇到了另一段也能正常工作的代码:

    [[RACSignal 
      combineLatest:@[username.rac_textSignal, password.rac_textSignal,confirmPassword.rac_textSignal]
      reduce:^(NSString *firstName, NSString *passwd, NSString *confirmPass){
             return @( firstName.length > 0 && passwd.length > 0 && confirmPass.length > 0);
      }] setKeyPath:@"enabled" onObject:resetButton];

我想弄清楚两种方式在内部实现方式是否完全相似,或者在某些情况下是否优于其他方式。 简单来说,任何人都能解释我在绩效方面的差异吗?

谢谢

1 个答案:

答案 0 :(得分:2)

如果您查看RAC宏并按照跟踪进行操作,您会发现它最终会调用-setKeyPath:onObject:RAC宏是为了方便(语法糖),没有性能影响。我已经看到有必要使用-setKeyPath:onObject:的唯一情况是当您需要访问由基础订阅创建的一次性用法时。我认为您不会发现很多情况需要自己处理基础订阅。