需求
當(dāng)我們需要對(duì)多個(gè)控件進(jìn)行監(jiān)聽處理。
例如:oneTextField和twoTextField都有值時(shí)做處理
//需求:oneTextField和twoTextField都有值時(shí)做處理
//添加兩個(gè)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];
笨方法
拿到兩個(gè)textField的值記錄判斷
[[oneTextField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}];
[[twoTextField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}];
RAC也提供了兩個(gè)方法來處理這樣需要組合的信號(hào)處理
方法一:
RAC提供了combineLatest方法把多個(gè)信號(hào) 捆綁成一個(gè)信號(hào) 最多不要超過五個(gè),如果你超過5個(gè)完全可以寫一個(gè)對(duì)象。返回值是RACTuple,類似Swift中的元組類型,他很想一個(gè)字典,里面可以放多種類型數(shù)據(jù)。
+ (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals
上面的可以寫成
[[RACSignal combineLatest:@[oneTextField.rac_textSignal, twoTextField.rac_textSignal]] subscribeNext:^(RACTuple * _Nullable x) {
//獲取第一個(gè)數(shù)據(jù)
NSString * name = x.first;
//獲取第二個(gè)數(shù)據(jù),以此類推第三個(gè)數(shù)據(jù)為three
NSString * pwd = x.second;
NSLog(@"賬號(hào):%@ ,密碼:%@", name,pwd);
}];
打印結(jié)果為:

image.png
方法二:
后面block中的id 是一個(gè)返回值
reduce: 對(duì)信號(hào)數(shù)據(jù)有一些邏輯處理可以在這個(gè)Block里進(jìn)行,返回一個(gè)結(jié)果。
可以根據(jù)監(jiān)聽的控件,手撕加參數(shù)
+ (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals reduce:(id (^)())reduceBlock;
上面的可以寫成
[[RACSignal combineLatest:@[oneTextField.rac_textSignal, twoTextField.rac_textSignal] reduce:^id _Nullable(NSString *account, NSString *pwd) {
//當(dāng)兩個(gè)textField的值不為空時(shí)返回YES,否則返回NO,這里可以實(shí)現(xiàn)值的轉(zhuǎn)換
return @(account.length > 0 && pwd.length > 0);
}] subscribeNext:^(id _Nullable x) {
//這里拿到的就是返回的結(jié)果
NSLog(@"%@",x );
}];;
結(jié)果如下,簡單實(shí)現(xiàn)登陸的監(jiān)聽

image.png

image.png