MVVM. RACiOS Developer

RAC处理信号(ReactiveCocoa)

2017-03-06  本文已影响106人  赤子追梦心

上一篇RAC,已经把信号的基本几步介绍完了(创建->订阅->发送->处理),这里,我们再详细说一下信号的处理,也就是第四步。

登录

这里我们以登录页面为例,一步步来实现一系列需求:

需求:

  1. 用户名格式输入正确之前,当前的TextField是红的,格式正确之后变正常;
  2. 密码长度输入到6个之前,当前的TextField是红的,长度够6个,变正常;
  3. 满足前两者之前 “登录”按钮是无效的。

Map

// 用户名
RACSignal *nameSignal = [self.tf_userName.rac_textSignal
                             map:^id(NSString *text) {
                                 return @([self isMobileNumber:text]);
                             }];
[nameSignal subscribeNext:^(id x) {
        self.tf_userName.backgroundColor = [x boolValue] ? [UIColor clearColor] : RGBACOLOR(255.0, 0, 0, 0.2);
    }];
// 密码
RACSignal *passWordSignal = [self.tf_passWord.rac_textSignal
                                 map:^id(NSString *text) {
                                     return @([self isPassword:text]);
                                 }];
[passWordSignal subscribeNext:^(id x) {
        self.tf_passWord.backgroundColor = [x boolValue] ? [UIColor clearColor] : RGBACOLOR(255.0, 0, 0, 0.2);
    }];

flattenMap

RACSignal *nameSignal = [self.tf_userName.rac_textSignal
                             flattenMap:^RACSignal*(NSString *text) {
                                 return [RACSignal return:[NSString stringWithFormat:@"改变后的信号:%@", text]];
                             }];
[nameSignal subscribeNext:^(id x) {
        NSLog(@"%@", x);
}];

聚合信号

在单独的textField中,我们只需要根据输入的字符来判断textField的样式就可以了,但是如果需要完成我们的任务三“满足前两者之前 “登录”按钮是无效的。”我们需要把两个信号聚合到一起来判断。

    RACSignal *loginSignal = [RACSignal combineLatest:@[nameSignal, passWordSignal] reduce:^id(NSNumber *userName, NSNumber *userPassWord){
        return @([userName boolValue] && [userPassWord boolValue]);
    }];
    [loginSignal subscribeNext:^(id x) {
        self.bt_Login.enabled = [x boolValue];
        NSLog(@"%@", x);
    }];

filter

  [[self.tf_userName.rac_textSignal filter:^BOOL(NSString *value) {
        
        NSLog(@"原信号: %@", value);
        
        return [self isMobileNumber:value];
        
    }] subscribeNext:^(id x) {
        
        NSLog(@"是真是手机号的信号:%@", x);
    }];

本文也是写的比较着急,还有很多知识点没有列举出来,接下来我会再来完善,如有错误之处,大家指点出来,谢谢。

上一篇下一篇

猜你喜欢

热点阅读