需求
当我们需要对多个控件进行监听处理。
例如: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