一些基本应用
/**
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