RAC处理信号(ReactiveCocoa)

上一篇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);
    }];
  • 分析:
    开发中,我们经常会用到判断手机号,甚至判断银行卡所属银行之类的功能。这些数据,有些事需要收费的,要实现格式正确,立马显示结果,我们不得不实时调用接口来判断,通过这个方法,我们用正则表达式可以做到初步的筛选,节省开销与流量。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • RAC使用测试Demo下载:github.com/FuWees/WPRACTestDemo 1.ReactiveC...
    FuWees阅读 6,344评论 3 10
  • 1.ReactiveCocoa常见操作方法介绍。 1.1 ReactiveCocoa操作须知 所有的信号(RACS...
    萌芽的冬天阅读 1,013评论 0 5
  • 前言由于时间的问题,暂且只更新这么多了,后续还会持续更新本文《最快让你上手ReactiveCocoa之进阶篇》,目...
    Karos_凯阅读 1,724评论 0 6
  • 1.ReactiveCocoa常见操作方法介绍1.1 ReactiveCocoa操作须知所有的信号(RACSign...
    IIronMan阅读 2,576评论 2 17
  • 有幸福的日子自己好好过就行了,至于我长多高有多胖今年几岁何时嫁人生活在怎样的水深火热中都不必他人费心。
    菜鸟nana阅读 125评论 0 0