美文网首页RACiOSiOS 你不知道的新鲜事
5分钟学会RAC里面80%的常见用法(2.5版本)

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

作者: 小明2021 | 来源:发表于2017-06-15 10:15 被阅读1294次

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

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

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

    Tip: 自己开发了好玩的APP: 《小明搜索》(App Store上搜索:"小明搜索")

    点击下载 "小明搜索"
    1、集必应、百度、搜狗为一体的搜索平台
    2、用户随意收藏或添加自己喜欢的网站
    3、网页文字播放功能
    4、收藏网页的视频,本地播放
    5、附加常用小工具
    6、后台播放网页音频
    7、3D Touch提供便捷入口
    完全自定义的搜索助手,简约的爱不释手~
    该APP不断完善中~

    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);
            }
        }];
    

    相关文章

      网友评论

      • pluskok:没 oc 版的?
        小明2021:@爱上雨天的鱼 这不就是oc版本?
      • Brant白叔:这就80%了啊?RACSubject\RACSignal都没有。
        小明2021:@瘦不拉夫斯基 好吧,我用的太浅了吧
        Brant白叔:@张明炜 RACSubject RACCommand在项目中应该用到非常多才对啊
        小明2021:@brantWU ,每个都用到RACSigal了,只是没有针对他的理论介绍而已,可以考虑简单的介绍一下,我更看重应用。
      • 简书lu: 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);
        }
        }];


        是不是应该写成RACObserve(self, password)
        小明2021:对的,多谢啦。我已经修改了:就是应该是:RACObserve(self, password)
      • 羊屎蛋儿:不错,一目了然,谢谢楼主分享😀
      • 当初的信仰呢:都是浅浅的用法
        当初的信仰呢:@张明炜 老哥稳
        小明2021:目前我们项目中只用到了这些。可能MVVM架构的项目会用到更多方法吧。这是入门,想用更深的方法就需要自己看文档了。

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

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