RAC应用

一些基本应用

/**
     TF相关
     */
    //监听文本输入
    [[self.tf1 rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"!!!![self.tf1 rac_textSignal] subscribeNext: %@",x);
    }];
    //监听tf本身事件
    [[self.tf1 rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(__kindof UITextField * _Nullable x) {
        NSLog(@"!!!!rac_signalForControlEvents: %@",x.text);
    }];
    //监听信号过滤。。。
    [[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相关
     */
    [[self.btn1 rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"!!!!rac_signalForControlEvents--TouchUpInside");
    }];

 //监听某一个变量变化
    [[self rac_valuesForKeyPath:@"racObserveValue" observer:self] subscribeNext:^(id  _Nullable x) {
        NSLog(@"rac_valuesForKeyPath : %@",x);
    }];
    //持有tf2的收入信号。。赋值给tf1
    RAC(self.tf1,text) = self.tf2.rac_textSignal;

订阅者相关

/**多个订阅者  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);
//    }];
//    //发送信号
//    [subject sendNext:@"信号dog"];
    
    /**RACTuple 类似于数组 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执行几次。。去销毁。。。net work request...耗时操作执行两次。。。
//     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只是最后执行了一次。。NSLog(@"net work request...耗时操作")这样只执行一次
//     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
     !!!注意:第一个信号必须调用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 捆绑信号 触发next操作(必须捆绑的信号都被触发)。。
     。如果其中有的信号没有send。则不触发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] !!!<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(@"!!!%@",x);
//       }];
#pragma mark --merge
    /***merge 捆绑信号 主要有捆绑内的信号被触发。都会调用。。
        区别于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] !!!--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] !!!--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] !!!--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(@"!!!--%@",x);
//      }];
    
    
#pragma mark --then
    /**
     then 先执行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出现。。combine触发。且取值a和b最新一对值。然后继续保留当前最新值继续。。。
//    [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优先取先入值,后入的暂存。。只要a/b都有值。。zip触发。取先入值。然后直接放弃老值取下一值再继续。。
//    [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  == 当B信号产生时候 取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方式。优先取先入值,后入的暂存。取一次后放弃。。继续取下一个。。
////    此时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 映射
        用于信号中信号,把源信号的内容映射成一个新的信号,信号可以是任意类型
        1. FlatternMap 中的Block 返回信号.
        2. Map 中的Block 返回对象.
        3. 开发中,如果信号发出的值不是信号,映射一般使用Map.
        4. 开发中,如果信号发出的值是信号,映射一般使用FlatternMap.
        参考 https://www.jianshu.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(@"!!!!-----%@",x);
//        }];
    
//    实例map
    //创建一个信号
//      RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//         //这个信号里面有一个Next事件的玻璃球和一个complete事件的玻璃球
//          [subscriber sendNext:@"唱歌"];
//          [subscriber sendCompleted];
//          return nil;
//
//      }];
//
//      //对信号进行改进,当信号里面流的是唱歌.就改进为'跳舞'返还给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;
//
//       }];
//       //对信号进行秩序秩序的第一步
//       siganl = [siganl flattenMap:^RACSignal *(NSString *value) {
//           //处理上一步的RACSiganl的信号value.这里的value=@"蛋液"
//           NSLog(@"把%@倒进锅里面煎",value);
//           return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//               [subscriber sendNext:@"煎蛋"];
//               [subscriber sendCompleted];
//               return nil;
//
//           }];
//
//       }];
//       //对信号进行第二步处理
//       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直到信号不同才触发
     */
//    [[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是开关。。只要B发送信号或者完成。。。A就发送不了了
     */
//    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;
//            }];
//
//        }];
//
//        //执行命令
//        [command execute:@"commandExcute"];
    
    #pragma mark -- RACReplaySubject  保存send信号,给每个订阅发发放
//    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时机是何时。。都会保存下消息。。给后来的订阅者接收。。
//    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 待所有信号都到后。执行方法调用。。保存了两条队列。获取最新值。。
//    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代理方法监听 and 通知监听方法
    
//    RAC_Delegate_Notif_VC * delevc = [[RAC_Delegate_Notif_VC alloc] init];
//    [self presentViewController:delevc animated:YES completion:nil];
//
    ////传统方式。。。
//    delevc.racDelegate = self;
//    实现- (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] !!!!methodparas
//        NSLog(@"代理方式1:%@",x.first);
//    }];
//    delevc.racDelegate = self;
    
    
    ////方式二。。利用信号量传递
    // log 代理方式2:!!!!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 -- 信号量的一些项目中实际应用。。。。。
    
    RAC_PRACViewController * vc = [[RAC_PRACViewController alloc] init];
    [self presentViewController:vc animated:NO completion:nil];
    
 

还有一些timer、代理、通知的方法具体看demo吧。。。
这个东西整体用下来真是个无底洞的感觉。。如果你想的话。。可以无处不在啊。。
从网络请求。到界面交互。。甚至在一些oc基础方法。都可以应用。。。
具体参考文档吧。。。
demo地址 https://github.com/khp0928/RacDemo_kk

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容