一、combineLatest:使用方法为
RACSubject *baseSubjectTwo = [RACSubject subject];
RACSubject *baseSignal = [RACSubject subject];
[[RACSignal combineLatest:@[baseSignal,baseSubjectTwo]]subscribeNext:^(id x) {
NSLog(@"信号发送combineLatest");
}];
此代码是将combineLatest:后面的数组中的信合打包成为一个新的信号。只有当两个信号都成功发送过信号的时候打包后的信号才能正常执行订阅后的代码块。
测试代码如下
self.oneSubejct = [RACSubject subject];
RACSubject *baseSignal = [RACSubject subject];
[[RACSignal combineLatest:@[baseSignal,self.oneSubejct]]subscribeNext:^(id x) {
NSLog(@"信号发送combineLatest");
}];
[baseSignal sendNext:@"testBac"];
控制台并没有任何输出。因为只有baseSignal进行的信号的发送。self.oneSubject并没有对信号发送。组合信号信息发送失败。
二、merge
此代码可以将merge:后数组中的信号合并为一个信号。只有有任意一个信号完成信息的发送。那么合并后的信号就可以正常的接收到信号。
测试代码如下
self.oneSubejct = [RACSubject subject];
RACSubject *baseSignal = [RACSubject subject];
[[RACSignal merge:@[self.oneSubejct,baseSignal]]subscribeNext:^(id x) {
NSLog(@"信号merge发送信号");
}];
[baseSignal sendNext:@"testBac"];
控制台输出
2018-01-26 15:42:07.763738+0800 RacReplaySubjectTest[3025:162396] 信号merge发送信号
结果分析:
combineLatest:被打包的信号都要完成信号的发送才能正常接收到信号。
merge:被合并的信号有任意一个完成发送都能正常被订阅接收信号。
注意:combineLatest打包的信号。只要所有的信号都已经被成功调阅过。就可以接收到发送的信号。信号被订阅之后,只要任意一个信号触发都可以。
效果如下:
- (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(@"信号发送combineLatest");
}];
[baseSignal sendNext:@"testBac"];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self.oneSubejct sendNext:@"abc"];
}
此程序在第一次运行的时候。因为只有baseSignal信号完成了信号的发送。所以combineLatest组合合成的信号并不能完成信号的订阅。
然后我们在view的touch事件上完成了self.oneSubject信号的发送。这个时候。可以看到控制台完成了输出。
2018-01-26 15:49:46.566807+0800 RacReplaySubjectTest[3057:165306] 信号发送combineLatest