一、combineLatest:使用方法為
RACSubject *baseSubjectTwo = [RACSubject subject];
RACSubject *baseSignal = [RACSubject subject];
[[RACSignal combineLatest:@[baseSignal,baseSubjectTwo]]subscribeNext:^(id x) {
NSLog(@"信號(hào)發(fā)送combineLatest");
}];
此代碼是將combineLatest:后面的數(shù)組中的信合打包成為一個(gè)新的信號(hào)。只有當(dāng)兩個(gè)信號(hào)都成功發(fā)送過信號(hào)的時(shí)候打包后的信號(hào)才能正常執(zhí)行訂閱后的代碼塊。
測(cè)試代碼如下
self.oneSubejct = [RACSubject subject];
RACSubject *baseSignal = [RACSubject subject];
[[RACSignal combineLatest:@[baseSignal,self.oneSubejct]]subscribeNext:^(id x) {
NSLog(@"信號(hào)發(fā)送combineLatest");
}];
[baseSignal sendNext:@"testBac"];
控制臺(tái)并沒有任何輸出。因?yàn)橹挥衎aseSignal進(jìn)行的信號(hào)的發(fā)送。self.oneSubject并沒有對(duì)信號(hào)發(fā)送。組合信號(hào)信息發(fā)送失敗。
二、merge
此代碼可以將merge:后數(shù)組中的信號(hào)合并為一個(gè)信號(hào)。只有有任意一個(gè)信號(hào)完成信息的發(fā)送。那么合并后的信號(hào)就可以正常的接收到信號(hào)。
測(cè)試代碼如下
self.oneSubejct = [RACSubject subject];
RACSubject *baseSignal = [RACSubject subject];
[[RACSignal merge:@[self.oneSubejct,baseSignal]]subscribeNext:^(id x) {
NSLog(@"信號(hào)merge發(fā)送信號(hào)");
}];
[baseSignal sendNext:@"testBac"];
控制臺(tái)輸出
2018-01-26 15:42:07.763738+0800 RacReplaySubjectTest[3025:162396] 信號(hào)merge發(fā)送信號(hào)
結(jié)果分析:
combineLatest:被打包的信號(hào)都要完成信號(hào)的發(fā)送才能正常接收到信號(hào)。
merge:被合并的信號(hào)有任意一個(gè)完成發(fā)送都能正常被訂閱接收信號(hào)。
注意:combineLatest打包的信號(hào)。只要所有的信號(hào)都已經(jīng)被成功調(diào)閱過。就可以接收到發(fā)送的信號(hào)。信號(hào)被訂閱之后,只要任意一個(gè)信號(hào)觸發(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(@"信號(hào)發(fā)送combineLatest");
}];
[baseSignal sendNext:@"testBac"];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self.oneSubejct sendNext:@"abc"];
}
此程序在第一次運(yùn)行的時(shí)候。因?yàn)橹挥衎aseSignal信號(hào)完成了信號(hào)的發(fā)送。所以combineLatest組合合成的信號(hào)并不能完成信號(hào)的訂閱。
然后我們?cè)趘iew的touch事件上完成了self.oneSubject信號(hào)的發(fā)送。這個(gè)時(shí)候??梢钥吹娇刂婆_(tái)完成了輸出。
2018-01-26 15:49:46.566807+0800 RacReplaySubjectTest[3057:165306] 信號(hào)發(fā)送combineLatest