小驢拉磨之—ReactiveCocao(RAC)組合信號(hào)

需求

當(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容