zoukankan      html  css  js  c++  java
  • ReactiveCocoa

    //KVO值监控,当alertTip改变时调用, filter对alertTip值进行过滤,此处当alertTip存在而长度不为0时,执行suscribeNext方法,弹出提示
     [[RACObserve(self, alertTip) filter:^BOOL(NSString * value) {
            return value.length != 0 && value;
        }] subscribeNext:^(NSString * tip) {
    
            Alert(tip);
        }];
    

      

     

       RAC(self.loginViewModel, userName) = self.userNameTF.rac_textSignal;
    // 作用: 将一个对象(self.loginViewModel) 的一个属性(userName) 和一个信号signal(rac_textSignal)绑定,当信号有变化的时候,绑定的值也对应变化
    RAC(self.loginViewModel, password) = self.passwordTF.rac_textSignal;
    
    
        @weakify(self) //避免block造成的循环引用 ,给一个按钮(loginButton) 添加事件(点击事件),
    
        [[self.loginButton rac_signalForControlEvents: UIControlEventTouchUpInside] subscribeNext:^(id x) {
    
            @strongify(self)
    
            if (self.loginViewModel.userName.length == 0) {
    
                self.loginViewModel.alertTip = @"用户名不能为空";
    
                return ;
    
            }
    
            if (self.loginViewModel.password.length == 0) {
    
                self.loginViewModel.alertTip = @"密码不能为空";
    
                return;
    
            }
    
            
    
            [self.loginViewModel clickLogin];
    
         }];
    


    [[[self.textField1.rac_textSignal startWith:@"输入框长度必须大于3" ] filter:^BOOL(NSString * tf) { return tf.length > 3; }] subscribeNext:^(NSString * tf) { NSLog(@"%@",tf); }]; //
    //startWith 说明作用 

      

       [[[self.textField1.rac_textSignal ignore: @"1"] startWith: @"忽略给定的值" ]subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
    //ignore 忽略给定的值

     

    RAC(self.showLabel, text) = [RACObserve(self, name) distinctUntilChanged];
        
        [RACObserve(self.showLabel, text) subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
    
        self.name = @"Bob";
         self.name= @"Bob";
         self.name= @"Bob2";
    //distinctUntilChanged 当和上一次值相同时会忽略 (例如修改用户名的时候,向网络提交时,如果和上一次相同就不必要执行操作)

      

    [[self.textField1.rac_textSignal takeUntilBlock:^BOOL(NSString * tf) {
            return  [tf isEqualToString: @"stop"];
        }] subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
    //当给定的signal完成前一直取值 (当输入框的值==stop前一直取值)

      

     [[self.textField1.rac_textSignal take: 4] subscribeNext:^(id x) {
            QLog(@"%@",x);
        }];
    //take 只会取前几次的值

      

    _subject = [RACSubject subject];
        [_subject subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
        
        [[_button2 rac_signalForControlEvents: UIControlEventTouchUpInside] subscribeNext:^(id x) {
            [_subject sendNext:@"点击按钮"];
        }];
    //RACSubject可充当信号也可以发送信号,通常用它来替代代理

     

    RACCommand * command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    
            NSLog(@"执行命令");
    
    //        return [RACSignal empty]; // 如果是空信号则返回
    
            return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    
          
    
                [subscriber sendNext: @"请求数据"];
    
                [HttpRequestManager request_login: dic block:^(NSInteger code, NSString *msg, id content) {
    
                    if (code == 200) { //请求成功
    
                        [subscriber sendNext: content];
    
                        [subscriber sendCompleted];//完成
    
                    }
    
                    else { //请求失败
    
                        [subscriber sendError: nil];
    
                    }
    
                }];
    
              
                return nil;
    
            }];
    
        }];
    
        self.command = command; //强引用命令,不要被销毁,否则接收不到数据
    
        //订阅RACCommand中的信号
    
        //    [[_button2 rac_signalForControlEvents: UIControlEventTouchUpInside] executeCommand: command];
    
    //绑定按钮事件 [[_button2 rac_signalForControlEvents: UIControlEventTouchUpInside] subscribeNext:^(id x) { [command execute: nil]; }]; [command.executionSignals subscribeNext:^(id x) { NSLog(@"%@",x); [x subscribeNext:^(id x) { NSLog(@"%@",x); }]; }]; //发出的最新信号,和上面代码效果相同(方式2)

       [command.executionSignals.switchToLatest subscribeNext:^(id x) {

            NSLog(@"%@",x);

        }];

    // 和上面效果相同(方式3) 

    //flattenMap作用:把源信号的内容映射成一个新的信号,信号可以是任意类型

    [command.executionSignals.switchToLatest flattenMap:^RACStream *(id value) {

            return  [RACStream return: command];

        }];


    [command.errors subscribeNext:^(NSError * error) { NSLog(@"%@",error); }];

      

       
    //map 映射, skip 跳过前几次
    [[[self.textField1.rac_textSignal map:^id(NSString * str) {
            return [NSString stringWithFormat:@"ABC-%@",str];
        }]
        skip: 2]
        subscribeNext:^(NSString * str) {
            NSLog(@"%@",str);
        }];
    

      

    //每隔1秒执行,类型定时器
    [[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
    

      

     

      

  • 相关阅读:
    codeforces 图论题目集(持续更新)
    整数快速幂
    Codeforces Codeforces Global Round 5 C2
    POJ 1061
    扩展欧几里德算法(数论)
    Codeforces Round #592 (Div. 2) 1224D
    Codeforces Round #582 (Div. 3) G. Path Queries
    2019 kickstart A轮 B 题
    P3379 【模板】最近公共祖先(LCA)
    bzoj 2002 分块
  • 原文地址:https://www.cnblogs.com/qzp2014/p/5139544.html
Copyright © 2011-2022 走看看