RAC應(yīng)用

一些基本應(yīng)用

/**
     TF相關(guān)
     */
    //監(jiān)聽文本輸入
    [[self.tf1 rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"!!!![self.tf1 rac_textSignal] subscribeNext: %@",x);
    }];
    //監(jiān)聽tf本身事件
    [[self.tf1 rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(__kindof UITextField * _Nullable x) {
        NSLog(@"!!!!rac_signalForControlEvents: %@",x.text);
    }];
    //監(jiān)聽信號過濾。屯仗。搞坝。
    [[self.tf1.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
        return  value.length > 10;
        }] subscribeNext:^(NSString * _Nullable x) {
            NSLog(@"!!!!filter value.len > 10 is :%@",x);
        }];
//    rac_newTextChannel
    /**
     UIButton相關(guān)
     */
    [[self.btn1 rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"!!!!rac_signalForControlEvents--TouchUpInside");
    }];

 //監(jiān)聽某一個變量變化
    [[self rac_valuesForKeyPath:@"racObserveValue" observer:self] subscribeNext:^(id  _Nullable x) {
        NSLog(@"rac_valuesForKeyPath : %@",x);
    }];
    //持有tf2的收入信號。魁袜。賦值給tf1
    RAC(self.tf1,text) = self.tf2.rac_textSignal;

訂閱者相關(guān)

/**多個訂閱者  replay的使用*/
        RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            static int a = 1;
            [subscriber sendNext:@(a)];
            a++;
            return nil;
        }] ;//訂閱者1 get a is 1  訂閱者2 get a is 2
        
        //    RACSignal *signal_replay = [[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        //        static int a = 1;
        //        [subscriber sendNext:@(a)];
        //         a++;
        //          return nil;
        //      }] replay]; //訂閱者1 get a is 1  訂閱者2 get a is 1
        
        [signal subscribeNext:^(NSNumber * x) {
            
            NSLog(@"訂閱者1 get a is %d",x.intValue); // 1
        }];
        [signal subscribeNext:^(NSNumber * x) {
            NSLog(@"訂閱者2 get a is %d",x.intValue);// 2
        }];
    
    /**RACSignal類目*/
//    RACSignal *signa2 =  [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
//         [subscriber sendNext:@"hahahah"];
//         [subscriber sendCompleted];
//         return [RACDisposable disposableWithBlock:^{
//             NSLog(@"銷毀了桩撮。。峰弹。");
//         }];
//     }];
//
//     [signa2 subscribeNext:^(id  _Nullable x) {
//         NSLog(@"!!!%@",x);
//         } error:^(NSError * _Nullable error) {
//             NSLog(@"!!!error....");
//         } completed:^{
//             NSLog(@"!!!complete....");
//         }];
     //2021-07-14 17:13:59.663634+0800 RacDemo_kk[11267:17001740] !!!hahahah
     //2021-07-14 17:13:59.663870+0800 RacDemo_kk[11267:17001740] !!!complete....
     //2021-07-14 17:13:59.664020+0800 RacDemo_kk[11267:17001740] 銷毀了距境。。垮卓。
 
    /////RACSubject: RACSignal
//    RACSubject *subject = [RACSubject subject];
//    //訂閱信號
//    [subject subscribeNext:^(id  _Nullable x) {
//        NSLog(@"!!!!%@", x);
//    }];
//    //發(fā)送信號
//    [subject sendNext:@"信號dog"];
    
    /**RACTuple 類似于數(shù)組 A tuple is an ordered collection of objects*/
//    RACTuple *tube = [RACTuple tupleWithObjects:@"1",@"2", nil];
//    tupleWithObjectsFromArray
//    - (nullable id)objectAtIndex:(NSUInteger)index;
//    - (NSArray *)allObjects;
    
    /***RACMulticastConnection 的使用垫桂。。*/
//    RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
//          NSLog(@"net work request...耗時操作")
//        [subscriber sendNext:@"dogggggg"];
//        [subscriber sendCompleted];
//        return [RACDisposable disposableWithBlock:^{
//            NSLog(@"return block signal銷毀了");
//        }];
//    }];
    
//    初始有幾個訂閱者粟按。诬滩。block執(zhí)行幾次。灭将。去銷毀疼鸟。。庙曙。net work request...耗時操作執(zhí)行兩次空镜。。。
//     2021-07-14 17:37:01.278058+0800 RacDemo_kk[11475:17029295] subscribeNext1---dogggggg
//     2021-07-14 17:37:01.278332+0800 RacDemo_kk[11475:17029295] !!!!complete
//     2021-07-14 17:37:01.278513+0800 RacDemo_kk[11475:17029295] return block signal銷毀了
//     2021-07-14 17:37:01.278698+0800 RacDemo_kk[11475:17029295] subscribeNext2---dogggggg
//     2021-07-14 17:37:01.278818+0800 RacDemo_kk[11475:17029295] !!!!complete
//     2021-07-14 17:37:01.278938+0800 RacDemo_kk[11475:17029295] return block signal銷毀了
//    [signal1 subscribeNext:^(id  _Nullable x) {
//        NSLog(@"subscribeNext1---%@",x);
//    } completed:^{
//        NSLog(@"!!!!complete");
//    }];
//    [signal1 subscribeNext:^(id  _Nullable x) {
//        NSLog(@"subscribeNext2---%@",x);
//    } completed:^{
//        NSLog(@"!!!!complete");
//    }];
    
//     初始定義的block只是最后執(zhí)行了一次吴攒。张抄。NSLog(@"net work request...耗時操作")這樣只執(zhí)行一次
//     2021-07-14 17:36:15.384524+0800 RacDemo_kk[11458:17028103] subscribeNext1--dogggggg
//     2021-07-14 17:36:15.384701+0800 RacDemo_kk[11458:17028103] subscribeNext2---dogggggg
//     2021-07-14 17:36:15.384834+0800 RacDemo_kk[11458:17028103] !!!!complete
//     2021-07-14 17:36:15.384929+0800 RacDemo_kk[11458:17028103] !!!!complete
//     2021-07-14 17:36:15.385063+0800 RacDemo_kk[11458:17028103] return block signal銷毀了
     
    //        RACMulticastConnection *connection = [signal1 publish];
    //        [connection.signal subscribeNext:^(id  _Nullable x) {
    //            NSLog(@"subscribeNext1--%@",x);
    //        }completed:^{
    //            NSLog(@"!!!!complete");
    //        }];
    //        [connection.signal subscribeNext:^(id  _Nullable x) {
    //            NSLog(@"subscribeNext2---%@",x);
    //        }completed:^{
    //            NSLog(@"!!!!complete");
    //        }];
    //        [connection connect];
}
    
    /**RACDisposable*/
//    2021-07-16 13:46:14.971251+0800 RacDemo_kk[17081:17848484] 111sig_subscribeNext x == 哈哈哈
//    2021-07-16 13:46:14.971465+0800 RacDemo_kk[17081:17848484] 222sig_subscribeNext x == 哈哈哈
//    2021-07-16 13:46:14.971628+0800 RacDemo_kk[17081:17848484] 222sig_subscribeNext x == 呵呵呵

//    RACSubject *signal = [RACSubject subject];
//    //訂閱信號,才會激活信號.
//    RACDisposable *dis1 = [signal subscribeNext:^(id  _Nullable x) {
//        NSLog(@"111sig_subscribeNext x == %@",x);
//    }];
//
//    [signal subscribeNext:^(id  _Nullable x) {
//        NSLog(@"222sig_subscribeNext x == %@",x);
//    }];
//
//    [signal sendNext:@"哈哈哈"];
//
//    [dis1 dispose];
//
//    [signal sendNext:@"呵呵呵"];

一些常用方法

    #pragma mark -- concat
    /**
     concat  有序接收信號 [signal1 concat:signal2] 先接收1的send  再接收2的send
     !M菡署惯!注意:第一個信號必須調(diào)用sendCompleted
     */
//    2021-07-15 10:37:40.378598+0800 RacDemo_kk[12509:17187304] signal3-->signal1
//    2021-07-15 10:37:40.378840+0800 RacDemo_kk[12509:17187304] signal3-->signal2
//    2021-07-15 10:37:40.378976+0800 RacDemo_kk[12509:17187304] signal2 delloc
//    2021-07-15 10:37:40.379167+0800 RacDemo_kk[12509:17187304] signal1 delloc
//    RACSignal *signal3 = [signal1 concat:signal2];
//        [signal3 subscribeNext:^(id  _Nullable x) {
//            NSLog(@"signal3-->%@",x);
//        }];
    
#pragma mark --combineLatestWith
    /***combineLatestWith 捆綁信號 觸發(fā)next操作(必須捆綁的信號都被觸發(fā))。镣隶。
     极谊。如果其中有的信號沒有send。則不觸發(fā)combineLatestWith*/
//    2021-07-15 10:41:45.579540+0800 RacDemo_kk[12584:17194523] signal1 delloc
//    2021-07-15 10:41:45.580068+0800 RacDemo_kk[12584:17194523] 0财瘛G岵!<RACTwoTuple: 0x600003c55580> (
//        "signal1 ",
//        "signal2 "
//    )
//    2021-07-15 10:41:45.580506+0800 RacDemo_kk[12584:17194523] signal2 delloc
//    RACSignal *signal3 = [signal1 combineLatestWith:signal2];
//    [signal3 subscribeNext:^(RACTuple* x) {
//           NSLog(@"S蚰恰M梢馈!%@",x);
//       }];
#pragma mark --merge
    /***merge 捆綁信號 主要有捆綁內(nèi)的信號被觸發(fā)琉雳。都會調(diào)用样眠。。
        區(qū)別于combine*/
//    1 信號都存在的時候
//    2021-07-15 11:17:12.841389+0800 RacDemo_kk[12876:17228441] signal1 block run...
//    2021-07-15 11:17:12.841681+0800 RacDemo_kk[12876:17228441] 4渲狻i苁!--signal1
//    2021-07-15 11:17:12.841926+0800 RacDemo_kk[12876:17228441] signal1 delloc
//    2021-07-15 11:17:12.842223+0800 RacDemo_kk[12876:17228441] signal2 block run...
//    2021-07-15 11:17:12.842405+0800 RacDemo_kk[12876:17228441] J丁1簧ァ!--signal2
//    2021-07-15 11:17:12.842553+0800 RacDemo_kk[12876:17228441] signal2 delloc
//    2 注釋掉信號1的時候
//    2021-07-15 11:18:21.728050+0800 RacDemo_kk[12890:17230048] signal1 block run...
//    2021-07-15 11:18:21.728292+0800 RacDemo_kk[12890:17230048] signal1 delloc
//    2021-07-15 11:18:21.728460+0800 RacDemo_kk[12890:17230048] signal2 block run...
//    2021-07-15 11:18:21.728620+0800 RacDemo_kk[12890:17230048] P髅谩I稹!--signal2
//    2021-07-15 11:18:21.728772+0800 RacDemo_kk[12890:17230048] signal2 delloc
//      RACSignal *signal3 = [signal1 merge:signal2];
//      [signal3 subscribeNext:^(RACTuple* x) {
//           NSLog(@"S士酢;蒲 !--%@",x);
//      }];
    
    
#pragma mark --then
    /**
     then 先執(zhí)行signal1的block  完成后婶肩。办陷。再接收signal2的信號。律歼。民镜。
     */
//    2021-07-15 11:05:29.161628+0800 RacDemo_kk[12749:17218611] signal1 block run...
//    2021-07-15 11:05:32.895118+0800 RacDemo_kk[12749:17218611] signal2 block run...
//    2021-07-15 11:05:32.895344+0800 RacDemo_kk[12749:17218611] signal4--signal2
//    2021-07-15 11:05:36.220775+0800 RacDemo_kk[12749:17218611] signal4 complete..
//    2021-07-15 11:05:36.220954+0800 RacDemo_kk[12749:17218611] signal2 delloc
//    2021-07-15 11:05:36.221081+0800 RacDemo_kk[12749:17218611] signal1 delloc
//    RACSignal * signal4 = [signal1 then:^RACSignal * _Nonnull{
//        return signal2;
//    }];
//    [signal4 subscribeNext:^(id  _Nullable x) {
//        NSLog(@"signal4--%@",x);
//    } completed:^{
//            NSLog(@"signal4 complete..");
//    }];
#pragma mark --reduce
    /***
     reduce 聚合  把多個信號的值按照自定義的組合返回
     */
//    2021-07-15 13:59:19.746923+0800 RacDemo_kk[13576:17348527] signal1 block run...
//    2021-07-15 13:59:19.747337+0800 RacDemo_kk[13576:17348527] signal1 delloc
//    2021-07-15 13:59:19.747543+0800 RacDemo_kk[13576:17348527] signal2 block run...
//    2021-07-15 13:59:19.747901+0800 RacDemo_kk[13576:17348527] !!!!-signal1 --signal2
//    2021-07-15 13:59:19.748125+0800 RacDemo_kk[13576:17348527] signal2 delloc
//    RACSignal * reduceSig = [RACSignal combineLatest:@[signal1,signal2]  reduce:^id (NSString *s1 ,NSString *s2){
//        return [NSString stringWithFormat:@"%@--%@",s1,s2];
//    }];
//    [reduceSig subscribeNext:^(id  _Nullable x) {
//        NSLog(@"!!!!-%@",x);
//    }];
    
//    RACSignal *signalA = self.textField.rac_textSignal;
//       RACSignal *signalB = [self.button rac_signalForControlEvents:UIControlEventTouchUpInside];
//       RACSignal *reduceSignal = [RACSignal combineLatest:@[signalA,signalB] reduce:^id (NSString *textFieldText,UIButton *value2 ){
//           return [NSString stringWithFormat:@"reduce == %@ %@",textFieldText,value2];
//       }];
//       [reduceSignal subscribeNext:^(id  _Nullable x) {
//           NSLog(@"subscribeNext %@",x);
//       }];
    
#pragma mark --combineLatest 、 zipwith险毁、zip取值sample
    /***
     combine 制圈、 zipwith们童、zip取值sample
     
     */
//    1、combine
//    RACSignal *combinelatest = [RACSignal combineLatest:@[aSubject,bSubject] reduce:^id (NSString * as ,NSString * bs){
//        return [NSString stringWithFormat:@"[%@+%@]",as,bs];
//    }];
    
//    2021-07-15 14:05:32.721972+0800 RacDemo_kk[13620:17354669] combinelatest-->:[B+1]
//    2021-07-15 14:05:32.722268+0800 RacDemo_kk[13620:17354669] combinelatest-->:[B+2]
//    2021-07-15 14:05:32.722512+0800 RacDemo_kk[13620:17354669] combinelatest-->:[C+2]
//    2021-07-15 14:05:32.722784+0800 RacDemo_kk[13620:17354669] combinelatest-->:[C+3]
//    2021-07-15 14:05:32.723000+0800 RacDemo_kk[13620:17354669] combinelatest-->:[D+3]
//    2021-07-15 14:05:32.723246+0800 RacDemo_kk[13620:17354669] combinelatest-->:[D+4]
// 可以看到鲸鹦。只要a/b都有值慧库。。只要sendNext出現(xiàn)亥鬓。。combine觸發(fā)域庇。且取值a和b最新一對值嵌戈。然后繼續(xù)保留當(dāng)前最新值繼續(xù)。听皿。熟呛。
//    [combinelatest subscribeNext:^(id  _Nullable x) {
//        NSLog(@"combinelatest-->:%@",x);
//    }];
//
//    [aSubject sendNext:@"A"];
//    [aSubject sendNext:@"B"];
//    [bSubject sendNext:@"1"];
//    [bSubject sendNext:@"2"];
//    [aSubject sendNext:@"C"];
//    [bSubject sendNext:@"3"];
//    [aSubject sendNext:@"D"];
//    [bSubject sendNext:@"4"];
    
    
//    2、zip
//    RACSignal *ziplatest = [RACSignal zip:@[aSubject,bSubject] reduce:^id (NSString * as ,NSString * bs){
//        return [NSString stringWithFormat:@"[%@+%@]",as,bs];
//    }];
////    2021-07-15 14:14:23.942338+0800 RacDemo_kk[13683:17363096] combinelatest-->:[A+3]
////    2021-07-15 14:14:23.942700+0800 RacDemo_kk[13683:17363096] combinelatest-->:[B+4]
////    2021-07-15 14:14:23.942886+0800 RacDemo_kk[13683:17363096] combinelatest-->:[C+1]
////    2021-07-15 14:14:23.943112+0800 RacDemo_kk[13683:17363096] combinelatest-->:[D+2]
//// 可以看到尉姨。zip優(yōu)先取先入值庵朝,后入的暫存。又厉。只要a/b都有值九府。。zip觸發(fā)覆致。取先入值侄旬。然后直接放棄老值取下一值再繼續(xù)。煌妈。
//    [ziplatest subscribeNext:^(id  _Nullable x) {
//        NSLog(@"combinelatest-->:%@",x);
//    }];
//
//    [aSubject sendNext:@"A"];
//    [aSubject sendNext:@"B"];
//    [aSubject sendNext:@"C"];
//    [bSubject sendNext:@"3"];
//    [aSubject sendNext:@"D"];
//    [bSubject sendNext:@"4"];
//    [bSubject sendNext:@"1"];
//    [bSubject sendNext:@"2"];
    
    //    3儡羔、zip取值sample   A sample B  == 當(dāng)B信號產(chǎn)生時候 取A最新值。璧诵。汰蜘。
//    RACSignal * sampleSub = [bSubject sample:aSubject];
//    RACSignal *zip_sample = [RACSignal zip:@[aSubject,sampleSub] reduce:^id (NSString * as ,NSString * bs){
//            return [NSString stringWithFormat:@"[%@+%@]",as,bs];
//        }];
////    2021-07-15 14:31:48.765163+0800 RacDemo_kk[13841:17382320] zip_sample-->:[A+2]
////    2021-07-15 14:31:48.765596+0800 RacDemo_kk[13841:17382320] zip_sample-->:[B+2]
////    2021-07-15 14:31:48.765900+0800 RacDemo_kk[13841:17382320] zip_sample-->:[C+3]
//    // 可以看到。aSubject依舊保持zip方式之宿。優(yōu)先取先入值族操,后入的暫存。取一次后放棄比被。坪创。繼續(xù)取下一個。姐赡。
////    此時sample方式莱预。則是只有a信號到來的時候獲取b最新值。项滑。每次都獲取最新值依沮。即便它是取過的舊值。。
//        [zip_sample subscribeNext:^(id  _Nullable x) {
//            NSLog(@"zip_sample-->:%@",x);
//        }];
//
//        [aSubject sendNext:@"A"];
//        [aSubject sendNext:@"B"];
//        [bSubject sendNext:@"1"];
//        [bSubject sendNext:@"2"];
//        [aSubject sendNext:@"C"];
//        [aSubject sendNext:@"m"];
//        [bSubject sendNext:@"3"];
//        [aSubject sendNext:@"D"];
//        [bSubject sendNext:@"4"];
    
    
    
#pragma mark --flattenMap map
       /***
        flattenMap & map 映射
        用于信號中信號,把源信號的內(nèi)容映射成一個新的信號,信號可以是任意類型
        1. FlatternMap 中的Block 返回信號.
        2. Map 中的Block 返回對象.
        3. 開發(fā)中,如果信號發(fā)出的值不是信號,映射一般使用Map.
        4. 開發(fā)中,如果信號發(fā)出的值是信號,映射一般使用FlatternMap.
        參考 http://www.reibang.com/p/42d4730ae8f5
        */
//    [[self.tf1.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
//        return [NSString stringWithFormat:@"0316-[%@]",value];
//        }] subscribeNext:^(id  _Nullable x) {
//            NSLog(@"!!!!-x:%@",x);
//        }
//     ];
//    [[self.tf2.rac_textSignal flattenMap:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {
//
//            return  [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
//                [subscriber sendNext:[NSString stringWithFormat:@"0316-[%@]",value]];
//                [subscriber sendCompleted];
//                return  [RACDisposable disposableWithBlock:^{}];
//            }];
//
//        }] subscribeNext:^(id  _Nullable x) {
//            NSLog(@"N:怼K斡妗!辜限!-----%@",x);
//        }];
    
//    實例map
    //創(chuàng)建一個信號
//      RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//         //這個信號里面有一個Next事件的玻璃球和一個complete事件的玻璃球
//          [subscriber sendNext:@"唱歌"];
//          [subscriber sendCompleted];
//          return nil;
//
//      }];
//
//      //對信號進(jìn)行改進(jìn),當(dāng)信號里面流的是唱歌.就改進(jìn)為'跳舞'返還給self.value
//
//      RAC(self, tF.text) = [signalA map:^id(NSString *value) {
//          if ([value isEqualToString:@"唱歌"]) {
//              return @"跳舞";
//          }
//          return @"";
//
//      }];
    
//     實例demoflattenmap
//    RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//           NSLog(@"打蛋液");
//           [subscriber sendNext:@"蛋液"];
//           [subscriber sendCompleted];
//           return nil;
//
//       }];
//       //對信號進(jìn)行秩序秩序的第一步
//       siganl = [siganl flattenMap:^RACSignal *(NSString *value) {
//           //處理上一步的RACSiganl的信號value.這里的value=@"蛋液"
//           NSLog(@"把%@倒進(jìn)鍋里面煎",value);
//           return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//               [subscriber sendNext:@"煎蛋"];
//               [subscriber sendCompleted];
//               return nil;
//
//           }];
//
//       }];
//       //對信號進(jìn)行第二步處理
//       siganl = [siganl flattenMap:^RACSignal *(id value) {
//           NSLog(@"把%@裝載盤里",value);
//           return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//               [subscriber sendNext:@"上菜"];
//               [subscriber sendCompleted];
//               return nil;
//           }];
//
//       }];
//
//       //最后打印 最后帶有===上菜
//       [siganl subscribeNext:^(id x) {
//           NSLog(@"====%@",x);
//       }];
   
#pragma mark --filter/filter/distinctUntilChanged
    /***
     filter 條件過濾信號值
     filter 條件忽略某種信號值
     distinctUntilChanged直到信號不同才觸發(fā)
     */
//    [[self.tf1.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
//        return  value.length > 2;
//        }] subscribeNext:^(NSString * _Nullable x) {
//            NSLog(@"filter :---%@",x);
//        }];
//
//    [[self.tf1.rac_textSignal ignore:@"123"] subscribeNext:^(NSString * _Nullable x) {
//        NSLog(@"ignore :---%@",x);
//    }];
////    2021-07-15 15:25:27.958729+0800 RacDemo_kk[14133:17428818] distinctUntilChanged :---123
////    2021-07-15 15:25:27.958973+0800 RacDemo_kk[14133:17428818] distinctUntilChanged :---345
//    [[aSubject distinctUntilChanged] subscribeNext:^(id  _Nullable x) {
//        NSLog(@"distinctUntilChanged :---%@",x);
//    }];
//    [aSubject sendNext:@"123"];
//    [aSubject sendNext:@"123"];
//    [aSubject sendNext:@"345"];
     
#pragma mark --takeUntil
    /***
     subjectA takeUntil:subjectB 有點A依賴B的意思皇拣。。B是開關(guān)薄嫡。氧急。只要B發(fā)送信號或者完成。毫深。吩坝。A就發(fā)送不了了
     */
//    RACSubject *subjectA = [RACSubject subject];
//    RACSubject *subjectB = [RACSubject subject];
//    [[subjectA takeUntil:subjectB] subscribeNext:^(id  _Nullable x) {
//        NSLog(@"%@",x);
//    }];
//    [subjectA sendNext:@"A"];
//    [subjectA sendNext:@"B"];
//    [subjectA sendNext:@"C"];
//
//    [subjectB sendNext:@"C"]; //或者 [subjectB sendCompleted];;
//
//    [subjectA sendNext:@"D"];//不打印
    
#pragma mark --command
    /***
     
     A command is a signal triggered in response to some action, typically
     /// UI-related.
     */
//    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
//            NSLog(@"commandblock run--> [%@]",input);
//            return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//                return nil;
//            }];
//
//        }];
//
//        //執(zhí)行命令
//        [command execute:@"commandExcute"];
    
    #pragma mark -- RACReplaySubject  保存send信號,給每個訂閱發(fā)發(fā)放
//    2021-07-16 10:16:39.533060+0800 RacDemo_kk[16152:17692044] sub 1.....
//    2021-07-16 10:16:39.533289+0800 RacDemo_kk[16152:17692044] sub 2....
//    2021-07-16 10:16:39.533458+0800 RacDemo_kk[16152:17692044] sub 1.....
//    2021-07-16 10:16:39.533590+0800 RacDemo_kk[16152:17692044] sub 2....
//    2021-07-16 10:16:39.534133+0800 RacDemo_kk[16152:17692044] sub 3....
//    2021-07-16 10:16:39.534273+0800 RacDemo_kk[16152:17692044] sub 3....
    //可見哑蔫。不管send時機(jī)是何時钉寝。。都會保存下消息闸迷。嵌纲。給后來的訂閱者接收。腥沽。
//    RACReplaySubject * sig =  [RACReplaySubject subject];
//
//    [sig subscribeNext:^(id  _Nullable x) {
//        NSLog(@"sub 1.....");
//    }];
//
//    [sig subscribeNext:^(id  _Nullable x) {
//        NSLog(@"sub 2....");
//    }];
//
//    [sig sendNext:@"1 and 2 after sentMSG1"];
//    [sig sendNext:@"1 and 2 after sentMSG2"];
//
//    [sig subscribeNext:^(id  _Nullable x) {
//        NSLog(@"sub 3....");
//    }];
    
    #pragma mark -- rac_liftSelector 信號處理有點類似combineLatast 待所有信號都到后疹瘦。執(zhí)行方法調(diào)用。巡球。保存了兩條隊列言沐。獲取最新值。酣栈。
//    2021-07-16 10:29:09.112666+0800 RacDemo_kk[16285:17705511] rac_liftSelector--p1:A1----p2:B2
//    2021-07-16 10:29:09.113138+0800 RacDemo_kk[16285:17705511] rac_liftSelector--p1:A2----p2:B2
//    2021-07-16 10:29:09.113501+0800 RacDemo_kk[16285:17705511] rac_liftSelector--p1:A3----p2:B2
    RACSignal *sigalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
          dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
              [subscriber sendNext:@"A1"];
              [subscriber sendNext:@"A2"];
              [subscriber sendNext:@"A3"];
          });
          return nil;
      }];
      
      RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
          [subscriber sendNext:@"B1"];
          [subscriber sendNext:@"B2"];
          [subscriber sendCompleted];
          return nil;
          
      }];
    [self rac_liftSelector:@selector(liftSelctorPara1:para2:) withSignals:sigalA,signalB, nil];
     
}

- (void)liftSelctorPara1:(NSString *)para1 para2:(NSString *)para2{
    NSLog(@"rac_liftSelector--p1:%@----p2:%@",para1,para2);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self dismissViewControllerAnimated:YES completion:nil];
}

#pragma mark -- 定時器方法
//    RacTimerInVC * tv = [[RacTimerInVC alloc] init];
//    [self presentViewController:tv animated:YES completion:nil];
    
#pragma mark --  delegate代理方法監(jiān)聽 and 通知監(jiān)聽方法
    
//    RAC_Delegate_Notif_VC * delevc = [[RAC_Delegate_Notif_VC alloc] init];
//    [self presentViewController:delevc animated:YES completion:nil];
//
    ////傳統(tǒng)方式险胰。。矿筝。
//    delevc.racDelegate = self;
//    實現(xiàn)- (void)RacDelegateMethod:(NSString *)blockPara
    
    
//// 方式一  rac方式  //<RAC_Delegate_Notif_VC_Delegate>不需要
//    [[self rac_signalForSelector:@selector(RacDelegateMethod:) fromProtocol:@protocol(RAC_Delegate_Notif_VC_Delegate)] subscribeNext:^(RACTuple * _Nullable x) {
//        //log:::: 2021-07-15 17:47:57.498043+0800 RacDemo_kk[14952:17539761] F鸨恪!=盐榆综!methodparas
//        NSLog(@"代理方式1:%@",x.first);
//    }];
//    delevc.racDelegate = self;
    
    
    ////方式二。铸史。利用信號量傳遞
    // log 代理方式2:1谴!A战巍判沟!RacDelegateMethod22 call ----》methodparas
//    delevc.racSubject = [RACSubject subject];
//    [delevc.racSubject subscribeNext:^(id  _Nullable x) {
//        NSLog(@"代理方式2:%@",x);
//    }];
    
#pragma mark -- 信號量的一些混合用法耿芹。。挪哄。
    
//    Rac_MoreViewController * vc = [[Rac_MoreViewController alloc] init];
//    [self presentViewController:vc animated:NO completion:nil];
    
#pragma mark -- 信號量的一些項目中實際應(yīng)用吧秕。。迹炼。砸彬。。
    
    RAC_PRACViewController * vc = [[RAC_PRACViewController alloc] init];
    [self presentViewController:vc animated:NO completion:nil];
    
 

還有一些timer斯入、代理砂碉、通知的方法具體看demo吧。咱扣。绽淘。
這個東西整體用下來真是個無底洞的感覺涵防。闹伪。如果你想的話。壮池∑浚可以無處不在啊。椰憋。
從網(wǎng)絡(luò)請求厅克。到界面交互。橙依。甚至在一些oc基礎(chǔ)方法证舟。都可以應(yīng)用。窗骑。女责。
具體參考文檔吧。创译。抵知。
demo地址 https://github.com/khp0928/RacDemo_kk

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市软族,隨后出現(xiàn)的幾起案子刷喜,更是在濱河造成了極大的恐慌,老刑警劉巖立砸,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掖疮,死亡現(xiàn)場離奇詭異,居然都是意外死亡颗祝,警方通過查閱死者的電腦和手機(jī)氮墨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門纺蛆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人规揪,你說我怎么就攤上這事桥氏。” “怎么了猛铅?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵字支,是天一觀的道長。 經(jīng)常有香客問我奸忽,道長堕伪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任栗菜,我火速辦了婚禮欠雌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疙筹。我一直安慰自己富俄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布而咆。 她就那樣靜靜地躺著霍比,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暴备。 梳的紋絲不亂的頭發(fā)上悠瞬,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音涯捻,去河邊找鬼浅妆。 笑死,一個胖子當(dāng)著我的面吹牛障癌,可吹牛的內(nèi)容都是我干的凌外。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼混弥,長吁一口氣:“原來是場噩夢啊……” “哼趴乡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝗拿,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晾捏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哀托,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惦辛,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年仓手,在試婚紗的時候發(fā)現(xiàn)自己被綠了胖齐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玻淑。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖呀伙,靈堂內(nèi)的尸體忽然破棺而出补履,到底是詐尸還是另有隱情,我是刑警寧澤剿另,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布箫锤,位于F島的核電站,受9級特大地震影響雨女,放射性物質(zhì)發(fā)生泄漏谚攒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一氛堕、第九天 我趴在偏房一處隱蔽的房頂上張望馏臭。 院中可真熱鬧,春花似錦讼稚、人聲如沸括儒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塑崖。三九已至七冲,卻和暖如春痛倚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背澜躺。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工蝉稳, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掘鄙。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓耘戚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親操漠。 傳聞我的和親對象是個殘疾皇子收津,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

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