iOS RAC使用补充

1  延迟执行

[[RACScheduler mainThreadScheduler] afterDelay:10 schedule:^{
        NSLog(@"延迟执行。。");
    }];

2  定时器  

[[RACSignal interval:5 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDate * _Nullable x) {
        NSLog(@"间隔执行。");
    }];

3 核心方法bind    

- (void)bind{
    // 假设想监听文本框的内容,并且在每次输出结果的时候,都在文本框的内容拼接一段文字“输出:”
     
    // 方式一:在返回结果后,拼接。
    [self.textField.rac_textSignal subscribeNext:^(id x) {
 
        NSLog(@"输出:%@",x);
    }];
     
     
    // map
    [[_textField.rac_textSignal map:^id(id value) {
        // 当源信号发出,就会调用这个block,修改源信号的内容
        // 返回值:就是处理完源信号的内容。
        return [NSString stringWithFormat:@"输出:%@",value];
    }] subscribeNext:^(id x) {
 
        NSLog(@"%@",x);
    }];
     
}

4  concat 方法

- (void)concat{
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         
        [subscriber sendNext:@1];
        [subscriber sendCompleted];
         
        return nil;
    }];
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
         
        [subscriber sendNext:@2];
         
        return nil;
    }];
     
    // 把signalA拼接到signalB后,signalA发送完成,signalB才会被激活。
    RACSignal *concatSignal = [signalA concat:signalB];
     
    // 以后只需要面对拼接信号开发。
    // 订阅拼接的信号,不需要单独订阅signalA,signalB
    // 内部会自动订阅。
    // 注意:第一个信号必须发送完成,第二个信号才会被激活
    [concatSignal subscribeNext:^(id x) {
         
        NSLog(@"%@",x);
         
    }];
    
}

类似的方法还有:zipWith(信号合并)     combineLatestWith(信号合并)

5  combineLatest  和reduce  的结合使用

  使用案例

 @weakify(self)
    RACSignal *signalA = self.textField.rac_textSignal;
    RACSignal *singalB = self.passwordField.rac_textSignal;
    [[RACSignal combineLatest:@[signalA,singalB] reduce:^id(NSString *account,NSString *password){
        return @(account.length > 0 && password.length > 0);
    }] subscribeNext:^(NSNumber  *x) {
        @strongify(self)
        NSLog(@"subscribeNext %@",x);
        self.button.enabled = x.integerValue;
    }];

6  双向绑定

   声明一个属性

@property (nonatomic , copy) NSString *name;

   创建一个label

  UILabel *myL = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 50)];
    myL.textColor = [UIColor lightGrayColor];
    [self.view addSubview:myL];

 实现绑定

RACChannelTo(myL,text,@"") = RACChannelTo(self,name); //双向绑定

这种绑定是双向的。左边的值改了右边的值也会一起改。同理右边的改了左边的也会同步修改。

RACChannelTo  中的三个参数1:对象   2:属性值   3:默认值(为null的时候默认显示的值)

原文地址:https://www.cnblogs.com/110-913-1025/p/11843028.html