美文网首页
06RAC--RACCommand

06RAC--RACCommand

作者: myk | 来源:发表于2018-05-22 10:27 被阅读6次
    • RACCommand:RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程,比如看事件有没有执行完毕
    • 使用场景:监听按钮点击,网络请求
    几种用法
    - (void)test1 {
        // RACCommand: 处理事件
        // 不能返回空的信号
        // 1.创建命令
        RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
            //block调用,执行命令的时候就会调用
            NSLog(@"input=%@",input); // input 为执行命令传进来的参数  
            // 这里的返回值不允许为nil
            return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
                [subscriber sendNext:@"执行命令产生的数据"];
                return nil;
            }];
        }];
        // 如何拿到执行命令中产生的数据呢?
        // 订阅命令内部的信号
        // ** 方式一:直接订阅执行命令返回的信号
        // 2.执行命令  返回一个RACSignal
        RACSignal *signal =[command execute:@2]; // 这里其实用到的是replaySubject 可以先发送命令再订阅
        // 在这里就可以订阅信号了
        [signal subscribeNext:^(id x) {
            NSLog(@"x=%@",x);
        }];
    }
    打印结果:input=2    x=执行命令产生的数据
    
    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
            NSLog(@"input === %@", input);
            return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
                [subscriber sendNext:@"333"];
                [subscriber sendCompleted];
                return [RACDisposable disposableWithBlock:^{
                    NSLog(@"销毁了");
                }];
            }];
        }];
        //executionSignals:信号源,信号中信号,signalofsignals:信号,发送数据就是信号
        [command.executionSignals subscribeNext:^(id x) {
            //x=== RACDynamicSignal 信号
            NSLog(@"x1=== %@", x);
            [x subscribeNext:^(id x) {
                //x 发送的信息
                NSLog(@"x2=== %@", x);
            }];
        }];
        //执行命令
        [command execute:@2];
    
    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
            NSLog(@"input === %@", input);
            return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
                [subscriber sendNext:@"333"];
                [subscriber sendCompleted];
                return [RACDisposable disposableWithBlock:^{
                    NSLog(@"销毁了");
                }];
            }];
        }];
        //switchToLatest获取最新发送的信号,只能用于信号中信号。
        [command.executionSignals.switchToLatest subscribeNext:^(id x) {
            //x现在是  发送的信息
            NSLog(@"x===%@",x);
        }];
        [command execute:@2];
    
    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
            NSLog(@"input === %@", input);
            return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
                [subscriber sendNext:@"333"];
                [subscriber sendCompleted];
                return [RACDisposable disposableWithBlock:^{
                    NSLog(@"销毁了");
                }];
            }];
        }];
        //command.executing:监听事件有没有完成
        [command.executing subscribeNext:^(id x) {
            NSLog(@"x === %@", x);
        }];
        [command execute:@2];
    
    RAC的宏定义
    • RAC():把一个对象的某个属性绑定一个信号,只要发出信号,就会把信号的内容给对象的属性赋值
    • RACObserve():快速的监听某个对象的某个属性改变,返回的是一个信号,对象的某个属性改变的信号
    //两种写法
    RAC(self.label, text) = self.textField.rac_textSignal;
    [self.textField.rac_textSignal subscribeNext:^(id x) {
         self.label.text = x;
    }];
    
    
     RAC(self.label, text) = self.textField.rac_textSignal;
    //监听self.label的text属性
     [RACObserve(self.label, text) subscribeNext:^(id x) {
         NSLog(@"====label的文字变了");
     }];
    

    相关文章

      网友评论

          本文标题:06RAC--RACCommand

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