zoukankan      html  css  js  c++  java
  • RAC基本使用

    @interface ViewController ()
    
    @property (weak, nonatomic) IBOutlet lwRedView *redView;
    @property (weak, nonatomic) IBOutlet UIButton *lwbtn;
    
    @property (weak, nonatomic) IBOutlet UITextField *phoneTF;
    @property (weak, nonatomic) IBOutlet UITextField *pwTF;
    @property (weak, nonatomic) IBOutlet UIButton *loginBtn;
    
    @property (nonatomic, strong) RACCommand * loginCommand;
    
    @end
    
    @implementation ViewController
    
    - (void)tryUseRACMethod
    {
        // map 可以转换 信号 (文本输入的字符串 转化为 是否长度为3的bool值)
        // 验证输入框的合法性
        RACSignal *phoneValidSignal = [self.phoneTF.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
            return @((value.length == 3));
        }];
        RACSignal *pwValidSignal = [self.pwTF.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
            return @(value.length>1&&value.length <= 6);
        }];
        
        // 根据监听输入框的内容,是否合法,来改变输入框的背景色
        [[phoneValidSignal map:^id _Nullable(id  _Nullable value) {
            return [value boolValue] ? UIColor.clearColor : UIColor.yellowColor;
        }] subscribeNext:^(id  _Nullable x) {
            self.phoneTF.backgroundColor = x;
        }];
        
    //    RAC(_phoneTF,backgroundColor) = [phoneValidSignal map:^id _Nullable(id  _Nullable value) {
    //        return value ? UIColor.clearColor : UIColor.yellowColor;
    //    }];
        RAC(_pwTF,backgroundColor) = [pwValidSignal map:^id _Nullable(id  _Nullable value) {
            return [value boolValue] ? UIColor.clearColor : UIColor.yellowColor;
        }];
        
        // 合并信号(手机号,密码输入框),创建一个新的关于按钮状态的信号,改变按钮的状态
        RACSignal *activeBtnSignal = [RACSignal combineLatest:@[phoneValidSignal,pwValidSignal] reduce:^id _Nullable(NSNumber *ph,NSNumber *pw){
            return @([ph boolValue] && [pw boolValue]);
        }];
        // 把按钮 和信号绑定
        [activeBtnSignal subscribeNext:^(id  _Nullable x) {
            self.loginBtn.backgroundColor = [x boolValue] ? UIColor.redColor : UIColor.grayColor;
        }];
        
        /// 创建一个登陆请求的信号
        RACSignal *loginSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            [self loginRequestWithPhone:self.phoneTF.text pw:self.pwTF.text callBlock:^(BOOL res) {
                [subscriber sendNext:@(res)];
                [subscriber sendCompleted];
            }];
            return nil;
        }];
        
        [[[[self.loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside]
          doNext:^(id  _Nullable x) {
              // 边际效应 不改变信号本身
              self.loginBtn.enabled = NO;
          }]
          // flattenMap 返回信号内容
          flattenMap:^__kindof RACSignal * _Nullable(__kindof UIControl * _Nullable value) {
              return loginSignal;
          }]
         subscribeNext:^(id  _Nullable x) {
             NSLog(@"----------%@",x);
             self.loginBtn.enabled = YES;
         }];
        
        
        [self.loginCommand.executionSignals.switchToLatest subscribeNext:^(id  _Nullable x) {
            NSLog(@"--------logincommand:%@",x);
        }];
        
        [[self.loginCommand executionSignals] subscribeNext:^(id  _Nullable x) {
            NSLog(@"--------1:%@",x);
            // 开始网络请求的信号
            self.view.backgroundColor = [UIColor redColor];
            [x subscribeNext:^(id  _Nullable x) {
                // 网络请求的回调信号
                NSLog(@"--------2:%@",x);
                self.view.backgroundColor = [UIColor whiteColor];
            }];
        }];
        
        [[self.loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside]
         subscribeNext:^(__kindof UIControl * _Nullable x) {
             // 开始执行command
             [self.loginCommand execute:nil];
         }];
    }
    
    // 模拟网络请求
    - (void)loginRequestWithPhone:(NSString *)phone pw:(NSString *)pw callBlock:(callBlock)callBlock
    {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            if ([phone isEqualToString:@"120"] && [pw isEqualToString:@"123"]) {
                if(callBlock) callBlock(YES);
            }else{
                if(callBlock) callBlock(NO);
            }
        });
    }
    
    - (RACCommand*)loginCommand
    {
        if (!_loginCommand) {
            
            _loginCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
                return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
                    NSString *phone = @"120";
                    NSString *pw = @"123";
                    /// 网络请求
                    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                        if ([phone isEqualToString:@"120"] && [pw isEqualToString:@"123"]) {
                            [subscriber sendNext:@(1)];
                        }else{
                            [subscriber sendNext:@(0)];
                        }
                        [subscriber sendCompleted];
                    });
                    return nil;
                }];
            }];
        }
        return _loginCommand;
    }
    
    - (void)testRACMethod
    {
        /** 监听方法 */
        [[self.redView rac_signalForSelector:@selector(clickBtn:)] subscribeNext:^(RACTuple * _Nullable x) {
            NSLog(@"========%@",x);
        }];
        
        /// 事件的响应
        [[self.lwbtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
            NSLog(@"------%@",x);
        }];
        
        /** 监听 kvo */
        [[self.redView rac_valuesForKeyPath:@"frame" observer:nil] subscribeNext:^(id  x) {
            NSLog(@"---------%@",x);
        }];
        // 宏定义的KVO
        [RACObserve(self.redView, frame) subscribeNext:^(id  _Nullable x) {
             NSLog(@"---------%@",x);
        }];
        
        /** 监听 通知 */
        [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"rac_noti_key" object:nil] subscribeNext:^(NSNotification * _Nullable x) {
            NSLog(@"-------------%@",x);
        }];
        
        // 监听输入框
        [self.wltf.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
            NSLog(@"------tf:%@",x);
        }];
        
        // 为输入框添加 filter 过滤器
        [[self.wltf.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
            return value.length < 4;
        }] subscribeNext:^(NSString * _Nullable x) {
            NSLog(@"-------filter_text:%@",x);
        }];
        
        [[[self.wltf.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
            // 转换信号流为 字符串长度信号流
            return @(value.length);
        }] filter:^BOOL(NSNumber*  _Nullable value) {
            return [value integerValue] > 3;
        }] subscribeNext:^(id  _Nullable x) {
            NSLog(@"==============%ld",[x integerValue]);
        }];
        
        /// 手势的使用
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
        [tap.rac_gestureSignal subscribeNext:^(__kindof UIGestureRecognizer * _Nullable x) {
            NSLog(@"-------%@",x);
        }];
        [self.view addGestureRecognizer:tap];
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [self tryUseRACMethod];
    }
    
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        _redView.frame = CGRectMake(10, 10, 300, 300);
    }
    
    @end
  • 相关阅读:
    smarty
    js进阶
    JS 基础
    php之面向对象(2)
    php之面向对象(1)
    PHP之图形处理
    PHP代码分离
    PHP文件上传与安全
    PHP substr截取中文字符出现乱码的问题解疑
    关于学习方法
  • 原文地址:https://www.cnblogs.com/liuwenqiang/p/10959237.html
Copyright © 2011-2022 走看看