(轉(zhuǎn)) ReactiveCocoa之RAC映射

- (void)map {  
      
    // Map使用步驟:  
    // 1.傳入一個block,類型是返回對象,參數(shù)是value  
    // 2.value就是源信號的內(nèi)容,直接拿到源信號的內(nèi)容做處理  
    // 3.把處理好的內(nèi)容,直接返回就好了,不用包裝成信號,返回的值,就是映射的值。  
      
    // Map底層實現(xiàn):  
    // 0.Map底層其實是調(diào)用flatternMap,Map中block中的返回的值會作為flatternMap中block中的值。  
    // 1.當(dāng)訂閱綁定信號,就會生成bindBlock。  
    // 3.當(dāng)源信號發(fā)送內(nèi)容,就會調(diào)用bindBlock(value, *stop)  
    // 4.調(diào)用bindBlock,內(nèi)部就會調(diào)用flattenMap的block  
    // 5.flattenMap的block內(nèi)部會調(diào)用Map中的block,把Map中的block返回的內(nèi)容包裝成返回的信號。  
    // 5.返回的信號最終會作為bindBlock中的返回信號,當(dāng)做bindBlock的返回信號。  
    // 6.訂閱bindBlock的返回信號,就會拿到綁定信號的訂閱者,把處理完成的信號內(nèi)容發(fā)送出來。  
      
      
      
    // Map作用:把源信號的值映射成一個新的值  
    // 創(chuàng)建信號  
    RACSubject *subject = [RACSubject subject];  
    // 綁定信號  
    RACSignal *bindSignal = [subject map:^id(id value) {  
          
        // 返回的類型就是你需要映射的值  
        return [NSString stringWithFormat:@"ws:%@", value]; //這里將源信號發(fā)送的“123” 前面拼接了ws:  
    }];  
    // 訂閱綁定信號  
    [bindSignal subscribeNext:^(id x) {  
        NSLog(@"%@", x);  
    }];  
    // 發(fā)送信號  
    [subject sendNext:@"123"];  
  
}  
  
/* 
 FlatternMap和Map的區(qū)別 
  
 1.FlatternMap中的Block返回信號。 
 2.Map中的Block返回對象。 
 3.開發(fā)中,如果信號發(fā)出的值不是信號,映射一般使用Map 
 4.開發(fā)中,如果信號發(fā)出的值是信號,映射一般使用FlatternMap。 
 */  
  
  
  
- (void)flatMap {  
      
    // 創(chuàng)建信號  
    RACSubject *subject = [RACSubject subject];  
    // 綁定信號  
    RACSignal *bindSignal = [subject flattenMap:^RACStream *(id value) {  
        // block:只要源信號發(fā)送內(nèi)容就會調(diào)用  
        // value: 就是源信號發(fā)送的內(nèi)容  
        // 返回信號用來包裝成修改內(nèi)容的值  
        return [RACReturnSignal return:value];  
          
    }];  
      
    // flattenMap中返回的是什么信號,訂閱的就是什么信號(那么,x的值等于value的值,如果我們操縱value的值那么x也會隨之而變)  
    // 訂閱信號  
    [bindSignal subscribeNext:^(id x) {  
        NSLog(@"%@", x);  
    }];  
      
    // 發(fā)送數(shù)據(jù)  
    [subject sendNext:@"123"];  
      
}  
  
- (void)flattenMap2 {  
    // flattenMap 主要用于信號中的信號  
     //signalOfsignals用FlatternMap  
    // 創(chuàng)建信號  
    RACSubject *signalofSignals = [RACSubject subject];  
    RACSubject *signal = [RACSubject subject];  
      
    // 訂閱信號  
    //方式1  
    //    [signalofSignals subscribeNext:^(id x) {  
    //  
    //        [x subscribeNext:^(id x) {  
    //            NSLog(@"%@", x);  
    //        }];  
    //    }];  
    // 方式2  
    //    [signalofSignals.switchToLatest  ];  
    // 方式3  
    //   RACSignal *bignSignal = [signalofSignals flattenMap:^RACStream *(id value) {  
    //  
    //        //value:就是源信號發(fā)送內(nèi)容  
    //        return value;  
    //    }];  
    //    [bignSignal subscribeNext:^(id x) {  
    //        NSLog(@"%@", x);  
    //    }];  
    // 方式4--------也是開發(fā)中常用的  
    [[signalofSignals flattenMap:^RACStream *(id value) {  
        return value;  
    }] subscribeNext:^(id x) {  
        NSLog(@"%@", x);  
    }];  
      
    // 發(fā)送信號  
    [signalofSignals sendNext:signal];  
    [signal sendNext:@"123"];  
}  

注:轉(zhuǎn)載自http://blog.csdn.net/y_csdnblog_xx/article/details/51480508

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

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

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