小驴拉磨之—ReactiveCocao(RAC)组合信号

2018-01-01  本文已影响63人  小驴拉磨

需求

当我们需要对多个控件进行监听处理。
例如:oneTextField和twoTextField都有值时做处理

//需求:oneTextField和twoTextField都有值时做处理
    //添加两个TextField
    UITextField *oneTextField = [[UITextField alloc] init];
    oneTextField.frame = CGRectMake(20, 100, 300, 44);
    oneTextField.borderStyle = 1;
    [self.view addSubview:oneTextField];
    
    UITextField *twoTextField = [[UITextField alloc] init];
    twoTextField.frame = CGRectMake(20, 150, 300, 44);
    twoTextField.borderStyle = 1;
    [self.view addSubview:twoTextField];

笨方法

拿到两个textField的值记录判断

    [[oneTextField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"%@",x);
    }];
    [[twoTextField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"%@",x);
    }];

RAC也提供了两个方法来处理这样需要组合的信号处理

方法一:
RAC提供了combineLatest方法把多个信号 捆绑成一个信号 最多不要超过五个,如果你超过5个完全可以写一个对象。返回值是RACTuple,类似Swift中的元组类型,他很想一个字典,里面可以放多种类型数据。

+ (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals

上面的可以写成

[[RACSignal combineLatest:@[oneTextField.rac_textSignal, twoTextField.rac_textSignal]] subscribeNext:^(RACTuple * _Nullable x) {
        //获取第一个数据
        NSString * name = x.first;
       //获取第二个数据,以此类推第三个数据为three
        NSString * pwd = x.second;
        
        NSLog(@"账号:%@ ,密码:%@", name,pwd);
    }];

打印结果为:


image.png

方法二:
后面block中的id 是一个返回值
reduce: 对信号数据有一些逻辑处理可以在这个Block里进行,返回一个结果。
可以根据监听的控件,手撕加参数

+ (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals reduce:(id (^)())reduceBlock;

上面的可以写成

[[RACSignal combineLatest:@[oneTextField.rac_textSignal, twoTextField.rac_textSignal] reduce:^id _Nullable(NSString *account, NSString *pwd) {
        //当两个textField的值不为空时返回YES,否则返回NO,这里可以实现值的转换
        return @(account.length > 0 && pwd.length > 0);
    }] subscribeNext:^(id  _Nullable x) {
        //这里拿到的就是返回的结果
        NSLog(@"%@",x );
    }];;

结果如下,简单实现登陆的监听

image.png image.png
上一篇 下一篇

猜你喜欢

热点阅读