, :
and RACSignal, :
RACSignal *signUpActiveSignal = [[RACSignal combineLatest:@[validEmailSignal,
validPasswordSignal,
validConfirmPasswordSignal]] and];
RAC enabled ( , subscribeNext RAC, , CGColorRef id):
RAC(self.signUpButton, enabled) = signUpActiveSignal;
, . :
RACSignal *validPasswordSignal = [passwordTextField.rac_textSignal map:^id(NSString *text) {
return @([text isEqualToString:self.confirmPasswordTextField.text] && text.length > 5);
}];
RACSignal *validConfirmPasswordSignal = [confirmPasswordTextField.rac_textSignal map:^id(NSString *text) {
return @([text isEqualToString:self.passwordTextField.text] && text.length > 5);
}];
, passwordTextField , confirmPasswordTextField. , passwordTextField, confirmPasswordTextField. , ( ) :
password: | | passwordValid: YES
confirm: | | confirmValid: YES
password: | asdf | passwordValid: NO
confirm: | | confirmValid: YES (this will only recalculate when the confirm field changes, not when the password field changes)
password: | asdf | passwordValid: NO (this didn't recalculate because the contents of the password field didn't change)
confirm: | asdf | confirmValid: YES
! , . , , :
RACSignal *passwordsMatch = [RACSignal combineLatest:@[passwordTextField.rac_textSignal,
confirmPasswordTextField.rac_textSignal]
reduce:(NSString *password, NSString *confirm) {
return @([password isEqualToString:confirm]);
}];
RACSignal *isPasswordLongEnough = [passwordTextField.rac_textSignal map:^(NSString *text) {
return @(text.length >= 6);
}];
:
RACSignal *signUpActiveSignal = [[RACSignal combineLatest:@[validEmailSignal,
isPasswordLongEnough,
passwordsMatch]] and];
, : " , , , ". !