ReactiveCocoa(九) 之RAC合并

@interface ViewController ()  
@property (weak, nonatomic) IBOutlet UITextField *accountField;  
@property (weak, nonatomic) IBOutlet UITextField *pwdField;  
@property (weak, nonatomic) IBOutlet UIButton *loginBtn;  
  
@end  
  
@implementation ViewController  
  
- (void)viewDidLoad {  
    [super viewDidLoad];  
    // Do any additional setup after loading the view, typically from a nib.  
    [self concat];  
      
}  
  
// 把多個(gè)信號(hào)聚合成你想要的信號(hào),使用場景----:比如-當(dāng)多個(gè)輸入框都有值的時(shí)候按鈕才可點(diǎn)擊。  
// 思路--- 就是把輸入框輸入值的信號(hào)都聚合成按鈕是否能點(diǎn)擊的信號(hào)。  
- (void)combineLatest {  
      
    RACSignal *combinSignal = [RACSignal combineLatest:@[self.accountField.rac_textSignal, self.pwdField.rac_textSignal] reduce:^id(NSString *account, NSString *pwd){ //reduce里的參數(shù)一定要和combineLatest數(shù)組里的一一對(duì)應(yīng)。  
        // block: 只要源信號(hào)發(fā)送內(nèi)容,就會(huì)調(diào)用,組合成一個(gè)新值。  
        NSLog(@"%@ %@", account, pwd);  
        return @(account.length && pwd.length);  
    }];  
      
    //    // 訂閱信號(hào)  
    //    [combinSignal subscribeNext:^(id x) {  
    //        self.loginBtn.enabled = [x boolValue];  
    //    }];    // ----這樣寫有些麻煩,可以直接用RAC宏  
    RAC(self.loginBtn, enabled) = combinSignal;  
      
      
    /* 
    RACSignal *signal = [RACSignal combineLatest:@[self.accountField.rac_textSignal,self.pwdField.rac_textSignal] reduce:^id(NSString *string1, NSString *string2){ 
         
        return @(string1.length && string2.length) ; 
         
    }]; 
     
     
     
    RAC(self.loginBtn,selected) = signal ; 
    */  
      
}  
  
  
- (void)zipWith {  
    //zipWith:把兩個(gè)信號(hào)壓縮成一個(gè)信號(hào),只有當(dāng)兩個(gè)信號(hào)同時(shí)發(fā)出信號(hào)內(nèi)容時(shí),并且把兩個(gè)信號(hào)的內(nèi)容合并成一個(gè)元祖,才會(huì)觸發(fā)壓縮流的next事件。  
    // 創(chuàng)建信號(hào)A  
    RACSubject *signalA = [RACSubject subject];  
    // 創(chuàng)建信號(hào)B  
    RACSubject *signalB = [RACSubject subject];  
    // 壓縮成一個(gè)信號(hào)  
    // **-zipWith-**: 當(dāng)一個(gè)界面多個(gè)請求的時(shí)候,要等所有請求完成才更新UI  
    // 等所有信號(hào)都發(fā)送內(nèi)容的時(shí)候才會(huì)調(diào)用  
    RACSignal *zipSignal = [signalA zipWith:signalB];  
    [zipSignal subscribeNext:^(id x) {  
        NSLog(@"%@", x); //所有的值都被包裝成了元組  
    }];  
      
    // 發(fā)送信號(hào) 交互順序,元組內(nèi)元素的順序不會(huì)變,跟發(fā)送的順序無關(guān),而是跟壓縮的順序有關(guān)[signalA zipWith:signalB]---先是A后是B  
    [signalA sendNext:@1];  
    [signalB sendNext:@2];  
  
}  
  
// 任何一個(gè)信號(hào)請求完成都會(huì)被訂閱到  
// merge:多個(gè)信號(hào)合并成一個(gè)信號(hào),任何一個(gè)信號(hào)有新值就會(huì)調(diào)用  
- (void)merge {  
    // 創(chuàng)建信號(hào)A  
    RACSubject *signalA = [RACSubject subject];  
    // 創(chuàng)建信號(hào)B  
    RACSubject *signalB = [RACSubject subject];  
    //組合信號(hào)  
    RACSignal *mergeSignal = [signalA merge:signalB];  
    // 訂閱信號(hào)  
    [mergeSignal subscribeNext:^(id x) {  
        NSLog(@"%@", x);  
    }];  
    // 發(fā)送信號(hào)---交換位置則數(shù)據(jù)結(jié)果順序也會(huì)交換  
    [signalB sendNext:@"下部分"];  
    [signalA sendNext:@"上部分"];  
}  
  
// then --- 使用需求:有兩部分?jǐn)?shù)據(jù):想讓上部分先進(jìn)行網(wǎng)絡(luò)請求但是過濾掉數(shù)據(jù),然后進(jìn)行下部分的,拿到下部分?jǐn)?shù)據(jù)  
- (void)then {  
    // 創(chuàng)建信號(hào)A  
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {  
        // 發(fā)送請求  
        NSLog(@"----發(fā)送上部分請求---afn");  
          
        [subscriber sendNext:@"上部分?jǐn)?shù)據(jù)"];  
        [subscriber sendCompleted]; // 必須要調(diào)用sendCompleted方法!  
        return nil;  
    }];  
      
    // 創(chuàng)建信號(hào)B,  
    RACSignal *signalsB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {  
        // 發(fā)送請求  
        NSLog(@"--發(fā)送下部分請求--afn");  
        [subscriber sendNext:@"下部分?jǐn)?shù)據(jù)"];  
        [subscriber sendCompleted];  
        return nil;  
    }];  
    // 創(chuàng)建組合信號(hào)  
    // then;忽略掉第一個(gè)信號(hào)的所有值  
    RACSignal *thenSignal = [signalA then:^RACSignal *{  
        // 返回的信號(hào)就是要組合的信號(hào)  
        return signalsB;  
    }];  
      
    // 訂閱信號(hào)  
    [thenSignal subscribeNext:^(id x) {  
        NSLog(@"%@", x);  
    }];  
  
}  
  
// concat----- 使用需求:有兩部分?jǐn)?shù)據(jù):想讓上部分先執(zhí)行,完了之后再讓下部分執(zhí)行(都可獲取值)  
- (void)concat {  
    // 組合  
      
    // 創(chuàng)建信號(hào)A  
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {  
        // 發(fā)送請求  
        //        NSLog(@"----發(fā)送上部分請求---afn");  
          
        [subscriber sendNext:@"上部分?jǐn)?shù)據(jù)"];  
        [subscriber sendCompleted]; // 必須要調(diào)用sendCompleted方法!  
        return nil;  
    }];  
      
    // 創(chuàng)建信號(hào)B,  
    RACSignal *signalsB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {  
        // 發(fā)送請求  
        //        NSLog(@"--發(fā)送下部分請求--afn");  
        [subscriber sendNext:@"下部分?jǐn)?shù)據(jù)"];  
        return nil;  
    }];  
      
      
    // concat:按順序去鏈接  
    //**-注意-**:concat,第一個(gè)信號(hào)必須要調(diào)用sendCompleted  
    // 創(chuàng)建組合信號(hào)  
    RACSignal *concatSignal = [signalA concat:signalsB];  
    // 訂閱組合信號(hào)  
    [concatSignal subscribeNext:^(id x) {  
        NSLog(@"%@",x);  
    }];  
  
}  
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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