5分钟学会RAC里面80%的常见用法(2.5版本)

RAC里面80%的用法是最常用同时也是很简单的,剩下20%的用法不常用同时也是不容易掌握的

备注:初学者很容易被RAC吓到,特别是看到网上有些文章大篇幅的介绍枯燥的理论和很少用到的高级用法后。

不要被RAC吓到,RAC并不难,难的那一部分在项目中很少遇到。所以:这篇文章只介绍最常用最简单的那 80%的用法(足够用了~)

1、 RAC - 通知 (不用手动移除通知了~)

//退出登录的方法里发送通知:
 [[NSNotificationCenterdefaultCenter]postNotificationName:@"log_out"object:nil];
// 接收通知的地方:(takeUntil:[self rac_willDeallocSignal]]这句可以保证在页面销毁的时候移除通知)
[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"login_out" object:nil] takeUntil:[self rac_willDeallocSignal]] subscribeNext:^(id x) {
       NSNotification* notification = (NSNotification*)x;
       // 退出登录的时候接受到的通知
    }];

2、RAC - UITextField输入限制

/// 监听输入金额是否合法([unowned self]可以避免swift循环引用,比OC更方便)
        self.codeTF.rac_textSignal().take(until: self.rac_willDeallocSignal()).subscribeNext { [unowned self] (text) in
            if let text = text as? String {
                if text.length >= 1 { // 输入内容的长度判断
                    self.submitBtn.backgroundColor = UIColor.getMain()
                    self.submitBtn.setTitleColor(UIColor.white, for: .normal)
                    self.submitBtn.isUserInteractionEnabled = true
                } else {
                    self.submitBtn.backgroundColor = UIColor.colorRGB16(value: 0xececec)
                    self.submitBtn.setTitleColor(UIColor.getContentSecond(), for: .normal)
                    self.submitBtn.isUserInteractionEnabled = false
                }
            }
        }

3、RAC - UIButton的点击事件

    // 普通按钮点击
    [[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
    }];
    //点击事件拦截。(filter 可以拦截某个条件的方法)
    [[[button rac_signalForControlEvents:UIControlEventTouchUpInside]filter:^BOOL(UIButton *button) {
        if ([button.currentTitle isEqualToString:@"sd"]) {
            return YES;
        }else{
            return NO;
        }
    }]subscribeNext:^(id x) {
        NSLog(@"点击事件");
    }];

4、RAC - SegmentedControl的点击事件

[[segmentedControl rac_signalForControlEvents:UIControlEventValueChanged] subscribeNext:^(id x) {
 }];

5、RAC - RACObserver

    //某个类的某个属性一发生变化就执行。
    [RACObserve(self, count) subscribeNext:^(id x) {
        if ([x integerValue] == 0) {
        }else if ([x integerValue] > 100){
        }
    }];
// 监听 contentOffset的值,比代理简单的多。
[RACObserve(scrollView, contentOffset) subscribeNext:^(id x) {
      NSLog(@"%@",x);
  }];
   
    //返回Bool赋值给createEnabled
    RAC(self, createEnabled) = [RACSignal combineLatest:@[RACObserve(self, password),RACObserve(self, passwordConfirm)] reduce:^(NSString *pwd,NSString *pwdConfirm) {
        return @([pwd isEqualToString:pwdConfirm]);
    }];

6、RAC - map的用法

//map 改变返回的类型给结果管道。(NSString--->UIColor)
    [[self.textField.rac_textSignal map:^id(NSString *text) {
        if ([text isEmptyString]) {
            return [UIColor whiteColor];
        }else{
            return [UIColor yellowColor];
        }
    }]subscribeNext:^(UIColor *color) {
        self.textField.backgroundColor = color;
    }];
   
  // 返回类型:UIButton --> NSString    
 [[[self.buttonrac_signalForControlEvents:UIControlEventTouchUpInside]map:^id(UIButton *button) {
        if ([button.currentTitle isEqualToString:@"按钮"]) {
            return [NSString stringWithFormat:@"按钮"];
        }else{
            return [NSString stringWithFormat:@"不是按钮"];
        }
    }]subscribeNext:^(NSString *resultString) {
        NSLog(@"%@",resultString);
    }];

7、RAC - filter 用法

//filter某个属性满足一定条件才执行。
    [[RACObserve(self, count) filter:^BOOL(id count) {//返回的是BOOL类型
        if ([count integerValue] == 5) {
            return YES;
        }else{
            return NO;
        }
    }]subscribeNext:^(id count) {//上面return YES 才走这里
        NSLog(@"数量为===%@",count);
    }];

8、RAC - UI绑定模型

// RAC() 可以将Signal发出事件的值赋值给某个对象的某个属性,其参数为对象名和属性名
// RACObserve() 参数为对象名和属性名,新建一个Signal并对对象的属性的值进行观察,当值变化时Signal会发出事件

// 这里不能使用基本数据类型,RAC中传递的都是id类型,使用基本类型会崩溃,所以使用map
RAC(self.lb_age,text)=[RACObserve(model, age) map:^id(id value) {
      return [NSString stringWithFomat:@"%@",value];
  }];
// 其实上面的写法也可以写成:(感觉是一样的)
[RACObserve(model, age) map:^id(id value) {
     self.lb_age.text =  [NSString stringWithFomat:@"%@",value];
  }];

9、RAC - combineLatest的用法

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

推荐阅读更多精彩内容