• ReactiveCocoa初步


    [self.usernameTextField.rac_textSignal subscribeNext:^(id x) {
      NSLog(@"%@", x);
    }];

    打印结果

    2013-12-24 14:48:50.359 RWReactivePlayground[9193:a0b] i
    2013-12-24 14:48:50.436 RWReactivePlayground[9193:a0b] is
    2013-12-24 14:48:50.541 RWReactivePlayground[9193:a0b] is 
    2013-12-24 14:48:50.695 RWReactivePlayground[9193:a0b] is t
    2013-12-24 14:48:50.831 RWReactivePlayground[9193:a0b] is th
    2013-12-24 14:48:50.878 RWReactivePlayground[9193:a0b] is thi
    2013-12-24 14:48:50.901 RWReactivePlayground[9193:a0b] is this
    2013-12-24 14:48:51.009 RWReactivePlayground[9193:a0b] is this 
    2013-12-24 14:48:51.142 RWReactivePlayground[9193:a0b] is this m
    2013-12-24 14:48:51.236 RWReactivePlayground[9193:a0b] is this ma
    2013-12-24 14:48:51.335 RWReactivePlayground[9193:a0b] is this mag
    2013-12-24 14:48:51.439 RWReactivePlayground[9193:a0b] is this magi
    2013-12-24 14:48:51.535 RWReactivePlayground[9193:a0b] is this magic
    2013-12-24 14:48:51.774 RWReactivePlayground[9193:a0b] is this magic?
    rac_textSignal文本信号订阅,传递给下一个,打印


    文本信号过滤(长度过滤)
    filter:
    filter:^BOOL(id value) {
        NSString *text = value;
        return text.length > 3;
      }]
    [[self.usernameTextField.rac_textSignal
      filter:^BOOL(id value) {
        NSString *text = value;
        return text.length > 3;
      }]
      subscribeNext:^(id x) {
        NSLog(@"%@", x);
      }];

    打印结果

    2013-12-26 08:17:51.335 RWReactivePlayground[9654:a0b] is t
    2013-12-26 08:17:51.478 RWReactivePlayground[9654:a0b] is th
    2013-12-26 08:17:51.526 RWReactivePlayground[9654:a0b] is thi
    2013-12-26 08:17:51.548 RWReactivePlayground[9654:a0b] is this
    2013-12-26 08:17:51.676 RWReactivePlayground[9654:a0b] is this 
    2013-12-26 08:17:51.798 RWReactivePlayground[9654:a0b] is this m
    2013-12-26 08:17:51.926 RWReactivePlayground[9654:a0b] is this ma
    2013-12-26 08:17:51.987 RWReactivePlayground[9654:a0b] is this mag
    2013-12-26 08:17:52.141 RWReactivePlayground[9654:a0b] is this magi
    2013-12-26 08:17:52.229 RWReactivePlayground[9654:a0b] is this magic
    2013-12-26 08:17:52.486 RWReactivePlayground[9654:a0b] is this magic?

    可见大于三个的输入才会把输入的文本信号传递给订阅者

    代码整理一下

    RACSignal *usernameSourceSignal = 
        self.usernameTextField.rac_textSignal;
     
    RACSignal *filteredUsername = [usernameSourceSignal  
      filter:^BOOL(id value) {
        NSString *text = value;
        return text.length > 3;
      }];
     
    [filteredUsername subscribeNext:^(id x) {
      NSLog(@"%@", x);
    }];

    订阅信号,过滤条件,传递给订阅者

    [[self.usernameTextField.rac_textSignal
      filter:^BOOL(id value) {
        NSString *text = value; // implicit cast
        return text.length > 3;
      }]
      subscribeNext:^(id x) {
        NSLog(@"%@", x);
      }];

    关于id value,在此例中就是传递的字符串

    可直接修改替换

    [[self.usernameTextField.rac_textSignal
      filter:^BOOL(NSString *text) {
        return text.length > 3;
      }]
      subscribeNext:^(id x) {
        NSLog(@"%@", x);
      }];
    rac_textSignal默认传递给订阅者的是文本内容,想传递其他的内容需要用到map
    map:^id(NSString *text) {
        return @(text.length);
      }]
    [[[self.usernameTextField.rac_textSignal
      map:^id(NSString *text) {
        return @(text.length);
      }]
      filter:^BOOL(NSNumber *length) {
        return [length integerValue] > 3;
      }]
      subscribeNext:^(id x) {
        NSLog(@"%@", x);
      }];

    传递给订阅者文本长度信号,再对这个信号进行了文本长度大于3的过滤器,最近订阅者终于订阅到了这个实时的文本输入长度信号

    2013-12-26 12:06:54.566 RWReactivePlayground[10079:a0b] 4
    2013-12-26 12:06:54.725 RWReactivePlayground[10079:a0b] 5
    2013-12-26 12:06:54.853 RWReactivePlayground[10079:a0b] 6
    2013-12-26 12:06:55.061 RWReactivePlayground[10079:a0b] 7
    2013-12-26 12:06:55.197 RWReactivePlayground[10079:a0b] 8
    2013-12-26 12:06:55.300 RWReactivePlayground[10079:a0b] 9
    2013-12-26 12:06:55.462 RWReactivePlayground[10079:a0b] 10
    2013-12-26 12:06:55.558 RWReactivePlayground[10079:a0b] 11
    2013-12-26 12:06:55.646 RWReactivePlayground[10079:a0b] 12

    当我们需要用一个方法来判断输入的用户名或者密码符合要求不,一般会写个额外的方法,然后在这个方法里进行正则匹配。

    那么 我们就要用这个方法来处理最初默认的文本内容信号

    RACSignal *validUsernameSignal =
      [self.usernameTextField.rac_textSignal
        map:^id(NSString *text) {
          return @([self isValidUsername:text]);
        }];
     
    RACSignal *validPasswordSignal =
      [self.passwordTextField.rac_textSignal
        map:^id(NSString *text) {
          return @([self isValidPassword:text]);
        }];

    根据这个NSNumber来传递一个UIColor

    [[validPasswordSignal
      map:^id(NSNumber *passwordValid) {
        return [passwordValid boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
      }]
      subscribeNext:^(UIColor *color) {
        self.passwordTextField.backgroundColor = color;
      }];

    看着上面的代码,还行,不过RAC有个更优雅的宏来展现

    RAC(self.passwordTextField, backgroundColor) =
      [validPasswordSignal
        map:^id(NSNumber *passwordValid) {
          return [passwordValid boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
        }];
     
    RAC(self.usernameTextField, backgroundColor) =
      [validUsernameSignal
        map:^id(NSNumber *passwordValid) {
         return [passwordValid boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
        }];

    通常情况下,登录一般是用户名和密码都匹配后才会在网络好的情况下登录成功。需要 进行信号混合

    RACSignal *signUpActiveSignal =
      [RACSignal combineLatest:@[validUsernameSignal, validPasswordSignal]
                        reduce:^id(NSNumber *usernameValid, NSNumber *passwordValid) {
                          return @([usernameValid boolValue] && [passwordValid boolValue]);
                        }];
  • 相关阅读:
    7.node.js的3DES 加密和解密的方法封装
    6.js 获取当前日期时间3种格式化方法
    2.深入解析Javascript异步编程
    5.js中的判断if和for
    4.js中的函数与方法
    String、StringBuffer、StringBuilder效率测试
    String、StringBuffer、StringBuilder区别
    StringBuffer常用方法
    SQL面试题
    String字符串拼接
  • 原文地址:https://www.cnblogs.com/songxing10000/p/4933543.html
Copyright © 2020-2023  润新知