Osheep

时光不回头,当下最重要。

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:@[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);
        }
    }];
点赞