一些基本應(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