• ReactiveCocoa使用详解


    ReactiveCocoa是基于响应式编程的实践,使用起来很方便,下面将讲解详细使用。

    1.监听对象的成员变量变化,当成员变量值被改变时,触发做一些事情.

    A)普通属性

      @property(nonatomic,copy) NSString *changeinput;

     [RACObserve(self, changeinput)  subscribeNext:^(id x) {

             NSLog(@"成员变量 changeinput 被修改成了:%@", x);

        }];

    当在其他地方修改了changeinput的属性值,将会调用。

    B)如何监听控件的值变化,

     [[self.textfiled.rac_textSignal

          filter:^(NSString *str) {

              if (str.integerValue > 30) {

                  return YES;

              } else {

                  return NO;

              }

          }]

         subscribeNext:^(NSString *str) {

              NSLog(@"textfield 控件变化了:%@",str);

         }];

    2. 属性绑定,转换数据流

      A)

       //直接绑定

     

        RAC(self.loginButton,enabled) =  RACObserve(self,isCanLogin);;

     //需要转换数据流,让输入和alpha绑定,当输入为12时,透明度为1.0 否则是0.5

     

        RACSignal *changeSignal =  RACObserve(self,changeinput);

     

        RAC(self.loginButton, alpha) = [changeSignal

     

                                     map:^id(NSString *str) {

     

                                         return [str isEqualToString:@"12"] ? @1.0 : @0.5;

     

                                     }];

     

    B)两个输入,按钮之间的绑定关系,当输入长度大于5时,按钮可点击

     

      RACSignal *validUsernameSignal = [self.textfiled.rac_textSignal map:^id(NSString *text) {

            return @(text.length >5);

        }];

        RACSignal *validPasswordSignal = [self.passwordTextfield.rac_textSignal map:^id(NSString *text) {

            return @(text.length >5);

        }];

        RACSignal *signUpActiveSignal = [RACSignal combineLatest:@[validUsernameSignal, validPasswordSignal]

                                                          reduce:^id(NSNumber *usernameValid, NSNumber *passwordValid){

                                                              return @([usernameValid boolValue] && [passwordValid boolValue]);

                                                          }];

        

        [signUpActiveSignal subscribeNext:^(NSNumber *signupActive) {

            self.loginButton.enabled = [signupActive boolValue];

        }];

    3.两个控件之间的绑定关系,如输入框输入,label显示输入结果

       RAC(self.outputLabel,text) =  self.textfiled.rac_textSignal;

      或者也可以和一个属性值绑定,当changeinput改变时,outputLabel也会发生改变,

      RAC(self.outputLabel, text) = RACObserve(self, changeinput);

     

      4.事件监听

    - (void)eventListener{

        RACSignal *buttonSignal = [self.signalButton rac_signalForControlEvents:UIControlEventTouchUpInside];

        [buttonSignal subscribeNext:^(id x) {

            NSLog(@"buttonSignal %@",buttonSignal);

        }];

        RACSignal *textChange = [self.passwordTextfield rac_textSignal];

        [textChange  subscribeNext:^(NSString *textfield)

         {

             NSLog(@"textfield %@", textfield);

          }];

         RACSignal *viewAppeared = [self rac_signalForSelector:@selector(viewDidAppear:)];

        [viewAppeared subscribeNext:^(id x) {

            NSLog(@"viewDidAppear %@", x);

        }];

    }

    5.其它的一些用法

    如,

    A)添加观察者

         [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"MyNotification" object:nil] subscribeNext:^(NSNotification *notification) {

            NSLog(@"Notification Received");

        }];

    B)object的dealloc被触发时,执行的一段代码,这样很方便吧

      NSArray *array = @[@"foo"]; 

         [[array rac_willDeallocSignal] subscribeCompleted:^

      {

      NSLog(@"will dealloc"); 

        }]; 

        array = nil; 

        



  • 相关阅读:
    【Kubernetes学习之一】Kubernetes 简介
    eclipse&myeclipse 生成jar包后,spring无法扫描到bean定义
    【Docker学习之七】Docker图形化管理和监控
    【Docker学习之六】Docker容器互联
    【Docker学习之五】Docker自定义镜像示例
    【Docker学习之四】Docker自定义容器镜像
    【Docker学习之三】Docker查找拉取镜像、启动容器、容器使用
    【Docker学习之二】Docker部署安装
    Tensorflow之tf.metrics
    pytorch 实现多分类
  • 原文地址:https://www.cnblogs.com/menchao/p/5502681.html
Copyright © 2020-2023  润新知