美文网首页MVVM. RACiOS Developer
RAC处理信号(ReactiveCocoa)

RAC处理信号(ReactiveCocoa)

作者: 追梦赤子心Year | 来源:发表于2017-03-06 12:08 被阅读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);
    }];
  • 分析:
    当textField中内容发生变化时,首先会对信号进行一次转换,这里面的isMobileNumberisPassword是一个手机号的正则方法和密码的正则方法,返回的是BOOL类型变量。这里我们将输入的内容用Map方法,转化成一个BOOL类型的值发送出去。接收的时候,我们对接收的值(这时候接到的已经是BOOL类型的值了)进行判断,如果为真,将红色提示框变为透明,否则反之。

flattenMap

  • 作用
    把源信号映射成一个新的信号,它可以是任何类型。
  • 使用
RACSignal *nameSignal = [self.tf_userName.rac_textSignal
                             flattenMap:^RACSignal*(NSString *text) {
                                 return [RACSignal return:[NSString stringWithFormat:@"改变后的信号:%@", text]];
                             }];
[nameSignal subscribeNext:^(id x) {
        NSLog(@"%@", x);
}];
  • 分析
    flattenMap在这里将源信号转化为一个新的信号,它与map的不同,主要在于flattenMap返回的是一个信号,而map返回的是一个值。

聚合信号

在单独的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);
    }];
  • 分析
    我们用combineLatest:reduce将两个信号聚合到一起,产生一个新的信号,当信号中国其中任何信号有新值时,都会执行reduce的block里面的方法。block再将信号发送个下一个订阅者。

filter

  • 作用:
    过滤信号。过滤掉不满足条件的信号,获取想要得到的信号。

  • 使用:

  [[self.tf_userName.rac_textSignal filter:^BOOL(NSString *value) {
        
        NSLog(@"原信号: %@", value);
        
        return [self isMobileNumber:value];
        
    }] subscribeNext:^(id x) {
        
        NSLog(@"是真是手机号的信号:%@", x);
    }];
  • 分析:
    开发中,我们经常会用到判断手机号,甚至判断银行卡所属银行之类的功能。这些数据,有些事需要收费的,要实现格式正确,立马显示结果,我们不得不实时调用接口来判断,通过这个方法,我们用正则表达式可以做到初步的筛选,节省开销与流量。

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

相关文章

  • RAC处理信号(ReactiveCocoa)

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

  • ReactiveCocoa基本了解

    ReactiveCocoa的基本了解 ReactiveCocoa简称RAC。 RAC的基本结构 信号源* RACS...

  • ReactiveCocoa笔记

    RAC 参考文章 细说ReactiveCocoa的冷信号与热信号(一) 细说ReactiveCocoa的冷信号与热...

  • ReactiveCocoa笔记1

    ReactiveCocoa笔记 map:方法可以转换信号,将一个信号处理后转变为另一个信号,例如: RAC(TAR...

  • RAC初识

    RAC: ReactiveCocoa 主要是由以下四大核心组件: RACStream :信号源 RAC...

  • ReactiveCocoa核心方法bind

    ReactiveCocoa操作所有的信号(RACSignal)都可以进行操作处理,因为所有的操作方法都定义在RAC...

  • 学习RAC记录

    FRP的核心是信号,信号在ReactiveCocoa(以下简称RAC)中是通过RACSignal来表示的,信号是数...

  • RAC 的使用

    RAC(ReactiveCocoa) 使用详解 RAC 是什么? ReactiveCocoa(RAC) githu...

  • ReactiveCocoa解读-订阅信号

    信号(Signal)和订阅者(Subscriber)是在ReactiveCocoa( 下文简称RAC)的相关资料中...

  • RACSignal源码解析

    RACStream 是 ReactiveCocoa 中的核心概念:信号;RACStream 中有2个子类: RAC...

网友评论

    本文标题:RAC处理信号(ReactiveCocoa)

    本文链接:https://www.haomeiwen.com/subject/wppwwttx.html