一碑诉、combineLatest:使用方法為
RACSubject *baseSubjectTwo = [RACSubject subject];
RACSubject *baseSignal = [RACSubject subject];
[[RACSignal combineLatest:@[baseSignal,baseSubjectTwo]]subscribeNext:^(id x) {
NSLog(@"信號發(fā)送combineLatest");
}];
此代碼是將combineLatest:后面的數(shù)組中的信合打包成為一個新的信號极景。只有當(dāng)兩個信號都成功發(fā)送過信號的時候打包后的信號才能正常執(zhí)行訂閱后的代碼塊措伐。
測試代碼如下
self.oneSubejct = [RACSubject subject];
RACSubject *baseSignal = [RACSubject subject];
[[RACSignal combineLatest:@[baseSignal,self.oneSubejct]]subscribeNext:^(id x) {
NSLog(@"信號發(fā)送combineLatest");
}];
[baseSignal sendNext:@"testBac"];
控制臺并沒有任何輸出。因?yàn)橹挥衎aseSignal進(jìn)行的信號的發(fā)送。self.oneSubject并沒有對信號發(fā)送棒搜。組合信號信息發(fā)送失敗豌鸡。
二嘿般、merge
此代碼可以將merge:后數(shù)組中的信號合并為一個信號。只有有任意一個信號完成信息的發(fā)送涯冠。那么合并后的信號就可以正常的接收到信號炉奴。
測試代碼如下
self.oneSubejct = [RACSubject subject];
RACSubject *baseSignal = [RACSubject subject];
[[RACSignal merge:@[self.oneSubejct,baseSignal]]subscribeNext:^(id x) {
NSLog(@"信號merge發(fā)送信號");
}];
[baseSignal sendNext:@"testBac"];
控制臺輸出
2018-01-26 15:42:07.763738+0800 RacReplaySubjectTest[3025:162396] 信號merge發(fā)送信號
結(jié)果分析:
combineLatest:被打包的信號都要完成信號的發(fā)送才能正常接收到信號。
merge:被合并的信號有任意一個完成發(fā)送都能正常被訂閱接收信號蛇更。
注意:combineLatest打包的信號瞻赶。只要所有的信號都已經(jīng)被成功調(diào)閱過。就可以接收到發(fā)送的信號械荷。信號被訂閱之后共耍,只要任意一個信號觸發(fā)都可以。
效果如下:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.oneSubejct = [RACSubject subject];
RACSubject *baseSignal = [RACSubject subject];
[[RACSignal combineLatest:@[baseSignal,self.oneSubejct]]subscribeNext:^(id x) {
NSLog(@"信號發(fā)送combineLatest");
}];
[baseSignal sendNext:@"testBac"];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self.oneSubejct sendNext:@"abc"];
}
此程序在第一次運(yùn)行的時候吨瞎。因?yàn)橹挥衎aseSignal信號完成了信號的發(fā)送痹兜。所以combineLatest組合合成的信號并不能完成信號的訂閱。
然后我們在view的touch事件上完成了self.oneSubject信號的發(fā)送颤诀。這個時候字旭。可以看到控制臺完成了輸出崖叫。
2018-01-26 15:49:46.566807+0800 RacReplaySubjectTest[3057:165306] 信號發(fā)送combineLatest