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];  
      
}  
  
// 把多個信號聚合成你想要的信號,使用場景----:比如-當(dāng)多個輸入框都有值的時候按鈕才可點擊。  
// 思路--- 就是把輸入框輸入值的信號都聚合成按鈕是否能點擊的信號满钟。  
- (void)combineLatest {  
      
    RACSignal *combinSignal = [RACSignal combineLatest:@[self.accountField.rac_textSignal, self.pwdField.rac_textSignal] reduce:^id(NSString *account, NSString *pwd){ //reduce里的參數(shù)一定要和combineLatest數(shù)組里的一一對應(yīng)茸俭。  
        // block: 只要源信號發(fā)送內(nèi)容专控,就會調(diào)用,組合成一個新值结缚。  
        NSLog(@"%@ %@", account, pwd);  
        return @(account.length && pwd.length);  
    }];  
      
    //    // 訂閱信號  
    //    [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:把兩個信號壓縮成一個信號奋刽,只有當(dāng)兩個信號同時發(fā)出信號內(nèi)容時备典,并且把兩個信號的內(nèi)容合并成一個元祖异旧,才會觸發(fā)壓縮流的next事件。  
    // 創(chuàng)建信號A  
    RACSubject *signalA = [RACSubject subject];  
    // 創(chuàng)建信號B  
    RACSubject *signalB = [RACSubject subject];  
    // 壓縮成一個信號  
    // **-zipWith-**: 當(dāng)一個界面多個請求的時候提佣,要等所有請求完成才更新UI  
    // 等所有信號都發(fā)送內(nèi)容的時候才會調(diào)用  
    RACSignal *zipSignal = [signalA zipWith:signalB];  
    [zipSignal subscribeNext:^(id x) {  
        NSLog(@"%@", x); //所有的值都被包裝成了元組  
    }];  
      
    // 發(fā)送信號 交互順序吮蛹,元組內(nèi)元素的順序不會變,跟發(fā)送的順序無關(guān)拌屏,而是跟壓縮的順序有關(guān)[signalA zipWith:signalB]---先是A后是B  
    [signalA sendNext:@1];  
    [signalB sendNext:@2];  
  
}  
  
// 任何一個信號請求完成都會被訂閱到  
// merge:多個信號合并成一個信號潮针,任何一個信號有新值就會調(diào)用  
- (void)merge {  
    // 創(chuàng)建信號A  
    RACSubject *signalA = [RACSubject subject];  
    // 創(chuàng)建信號B  
    RACSubject *signalB = [RACSubject subject];  
    //組合信號  
    RACSignal *mergeSignal = [signalA merge:signalB];  
    // 訂閱信號  
    [mergeSignal subscribeNext:^(id x) {  
        NSLog(@"%@", x);  
    }];  
    // 發(fā)送信號---交換位置則數(shù)據(jù)結(jié)果順序也會交換  
    [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)建信號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)建信號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)建組合信號  
    // then;忽略掉第一個信號的所有值  
    RACSignal *thenSignal = [signalA then:^RACSignal *{  
        // 返回的信號就是要組合的信號  
        return signalsB;  
    }];  
      
    // 訂閱信號  
    [thenSignal subscribeNext:^(id x) {  
        NSLog(@"%@", x);  
    }];  
  
}  
  
// concat----- 使用需求:有兩部分?jǐn)?shù)據(jù):想讓上部分先執(zhí)行务唐,完了之后再讓下部分執(zhí)行(都可獲取值)  
- (void)concat {  
    // 組合  
      
    // 創(chuàng)建信號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)建信號B带兜,  
    RACSignal *signalsB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {  
        // 發(fā)送請求  
        //        NSLog(@"--發(fā)送下部分請求--afn");  
        [subscriber sendNext:@"下部分?jǐn)?shù)據(jù)"];  
        return nil;  
    }];  
      
      
    // concat:按順序去鏈接  
    //**-注意-**:concat枫笛,第一個信號必須要調(diào)用sendCompleted  
    // 創(chuàng)建組合信號  
    RACSignal *concatSignal = [signalA concat:signalsB];  
    // 訂閱組合信號  
    [concatSignal subscribeNext:^(id x) {  
        NSLog(@"%@",x);  
    }];  
  
}  
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市刚照,隨后出現(xiàn)的幾起案子刑巧,更是在濱河造成了極大的恐慌,老刑警劉巖无畔,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啊楚,死亡現(xiàn)場離奇詭異,居然都是意外死亡浑彰,警方通過查閱死者的電腦和手機恭理,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郭变,“玉大人颜价,你說我怎么就攤上這事∷弑簦” “怎么了周伦?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長未荒。 經(jīng)常有香客問我专挪,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任寨腔,我火速辦了婚禮困肩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脆侮。我一直安慰自己锌畸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布靖避。 她就那樣靜靜地躺著潭枣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幻捏。 梳的紋絲不亂的頭發(fā)上盆犁,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音篡九,去河邊找鬼谐岁。 笑死,一個胖子當(dāng)著我的面吹牛榛臼,可吹牛的內(nèi)容都是我干的伊佃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沛善,長吁一口氣:“原來是場噩夢啊……” “哼航揉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起金刁,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤帅涂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尤蛮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體媳友,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年产捞,在試婚紗的時候發(fā)現(xiàn)自己被綠了醇锚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡轧葛,死狀恐怖搂抒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尿扯,我是刑警寧澤求晶,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站衷笋,受9級特大地震影響芳杏,放射性物質(zhì)發(fā)生泄漏矩屁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一爵赵、第九天 我趴在偏房一處隱蔽的房頂上張望吝秕。 院中可真熱鬧,春花似錦空幻、人聲如沸烁峭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽约郁。三九已至,卻和暖如春但两,著一層夾襖步出監(jiān)牢的瞬間鬓梅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工谨湘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绽快,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓紧阔,卻偏偏與公主長得像坊罢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寓辱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容