ReactiveCocoa学习(二)

前端之家收集整理的这篇文章主要介绍了ReactiveCocoa学习(二)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

登录为例

一般登录界面都会有一用户名和密码输入框,还有一个登录按钮,这次仅仅为了展现一个登录的,不涉及注册和忘记密码,记住密码此类功能
RAC里面很多都是以block的形式出现的,这样会造成内存警告,所以务必要写上typeof(self)weakSelf = self;之后调用方法或者属性用weakSelf代替
考虑UE
1:假设现在要求 用户名长度 >=2且密码长度>=3,登录按钮可用。由于现在RAC是以Signal为机制的,那么用户名长度变化为一个Signal命名为validUsernameSignal密码长度变化为一个Signal 命名为validPasswordSignal,且在两者输入无效的情况下,输入框为黄色,反之白色 。即

  1. //为了简单的监测用户输入的有效
  2. -(BOOL) isValidInput:(NSString *)text tag:(NSInteger)tag{
  3. BOOL flag = NO;
  4. if (tag == 0) {
  5. //用户名
  6. flag = text.length >= 2;
  7. }else{
  8. //密码
  9. flag = text.length >= 3;
  10.  
  11. }
  12. return flag;
  13. }
  14.  
  15. typeof(self)weakSelf = self;
  16. RACSignal *validUsernameSignal = [_nameTextField.rac_textSignal map:^id(id value) {
  17. return @([weakSelf isValidInput:value tag:0]);
  18. }];
  19. RACSignal *validPasswordSignal = [_pwdTextField.rac_textSignal map:^id(NSString *text) {
  20. return @([weakSelf isValidInput:text tag:1]);
  21. }];
  22. //转换这些信号,从而能为输入框设置不同的背景颜色。
  23. RAC(_nameTextField,backgroundColor) =
  24. [validUsernameSignal
  25. map:^id(NSNumber *nameValid){
  26. return[nameValid boolValue] ? [UIColor clearColor]:[UIColor yellowColor];
  27. }];
  28. RAC(_pwdTextField,backgroundColor) = [validPasswordSignal
  29. map:^id(NSNumber *passwordValid){
  30. return[passwordValid boolValue] ? [UIColor clearColor]:[UIColor yellowColor];
  31. }];

2: 把以上两个信号组合一起,才能真正的表示登录按钮的可用性(enabled)

  1. //信号聚合 使用combineLatest:reduce:方法把validUsernameSignal和validPasswordSignal产生的最新的值聚合在一起,并生成一个新的信号。每次这两个源信号的任何一个产生新值时,reduce block都会执行,block的返回值会发给下一个信号。
  2. RACSignal *signUpActiveSignal = [RACSignal combineLatest:@[validUsernameSignal,validPasswordSignal] reduce:^id(NSNumber*usernameValid,NSNumber *passwordValid){
  3. return @([usernameValid boolValue]&&[passwordValid boolValue]);
  4. }];
  5. [signUpActiveSignal subscribeNext:^(NSNumber*signupActive){
  6. _loginBtn.enabled = [signupActive boolValue];
  7. _loginBtn.alpha = [signupActive boolValue] ? 1:0.4;
  8. }];

3: 当登录按钮可用,点击登录按钮,如果登录成功,则进入登录成功界面反之失败界面。这里假设用户名输入的为“123”则登录成功。

  1. [[[_loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside]flattenMap:^RACStream *(id value) {
  2. return [weakSelf signInSignal];
  3. }]subscribeNext:^(id x) {
  4. [weakSelf IsloginSuccess:[x boolValue]];
  5. }];
  6. - (RACSignal *)signInSignal{
  7. [self resignResponder];
  8. typeof(self)weakSelf = self;
  9. return [RACSignal createSignal:^RACDisposable *(id subscriber){
  10. [weakSelf login:_nameTextField.text password:_pwdTextField.text block:^(BOOL obj) {
  11. [subscriber sendNext:@(obj)];
  12. [subscriber sendCompleted];
  13. }];
  14. return nil;
  15. }];
  16. }
  17. -(void)IsloginSuccess:(BOOL)flag{
  18. SuccessViewController *uisvc = [[ SuccessViewController alloc]init];
  19. [self.navigationController pushViewController:uisvc animated:true];
  20. uisvc.title = flag ?@"登录成功": @"登录失败";
  21.  
  22. }
  23. - (void) login:(NSString * )carNumber password:(NSString *)pwd block:(Block_Bool)result{
  24. //Block_Bool的define定义 :typedef void (^Block_Bool) (BOOL b);
  25.  
  26. if ([_nameTextField.text isEqualToString:@"123"]) {
  27. result(YES);
  28. return;
  29. }
  30. result(NO);
  31.  
  32. }

4:为了更好的展示UE当点击self.view时,让键盘隐藏,这时加个手势:

  1. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]init];
  2. tap.numberOfTapsrequired = 1;
  3. tap.numberOfTouchesrequired = 1;
  4. [self.view addGestureRecognizer:tap];
  5. // 这是给self.view加上一个事件,点击的时候让键盘隐藏。
  6. [tap rac_signalForSelector:@selector(resignResponder)];
  7. RACSignal *tapSignal = [tap rac_gestureSignal];
  8. [[tapSignal map:^id(id value) {
  9. return value;
  10. }] subscribeNext:^(id x) {
  11. [weakSelf.view endEditing:YES];
  12. }];

猜你在找的React相关文章