直接上代碼,letters和number信號(hào)分別采用combine,zip,zip和sample方法,合并輸出新的信號(hào).
- (void)signalCombineTest{
RACSubject *letters = [RACSubject subject];
RACSubject *numbers = [RACSubject subject];
RACSignal *combined = [RACSignal combineLatest:@[letters,numbers] reduce:^id(NSString *letter,NSString *number){
return [letter stringByAppendingString:number];
}];
// Outputs: B1 B2 C2 C3 D3 D4
[combined subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
[letters sendNext:@"A"];
[letters sendNext:@"B"];
[numbers sendNext:@"1"];
[numbers sendNext:@"2"];
[letters sendNext:@"C"];
[numbers sendNext:@"3"];
[letters sendNext:@"D"];
[numbers sendNext:@"4"];
/**
| letter |- A - B - - - C - - D
| number |- - - 1 - 2 - 3 - - 4
| new |- - - - B1 - B2 C2 C3 - D3 D4
-------------- time ----------------------->
可以發(fā)現(xiàn)letter信號(hào)的A值被更新的B值覆蓋了,所以接下來(lái)接收到number信號(hào)的1時(shí)候,合并,輸出信號(hào)B1.
當(dāng)接收到C的時(shí)候,與number的最新的值2合并,輸出信號(hào)C2.
*/
}
- (void)signalZipTest{
RACSubject *letters = [RACSubject subject];
RACSubject *numbers = [RACSubject subject];
RACSignal *zipSignal = [RACSignal zip:@[letters,numbers] reduce:^id(NSString *letter,NSString *number){
return [letter stringByAppendingString:number];
}];
// Outputs: A1 B2 C3 D4
[zipSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[letters sendNext:@"A"];
[letters sendNext:@"B"];
[numbers sendNext:@"1"];
[numbers sendNext:@"2"];
[numbers sendNext:@"3"];
[letters sendNext:@"C"];
[letters sendNext:@"D"];
[numbers sendNext:@"4"];
/**
| letter |- A - B - - - - - - C - D
| number |- - - - 1 - 2 - 3 - - - 4
| new |- - - - - A1 - B2 - - C3 - - D4
-------------- time ----------------------->
zip的合并行為是按順序取出各個(gè)信號(hào)然后合并發(fā)出的.也就是說(shuō),
letters的第一個(gè)值A(chǔ)和number的第一個(gè)值1合并輸出A1,第二個(gè)值B和number的第二個(gè)值2合并輸出B2
假設(shè)D后面,還有E,F,G...,但是沒(méi)有對(duì)應(yīng)的number信號(hào),zip的合并行為就無(wú)法進(jìn)行下去了.
*/
}
- (void)signalZipWithSampleTest{
RACSubject *letters = [RACSubject subject];
RACSubject *numbers = [RACSubject subject];
RACSignal *combined = [RACSignal
zip:@[ letters, [numbers sample:letters]]
reduce:^(NSString *letter, NSString *number) {
return [letter stringByAppendingString:number];
}];
// Outputs: A1 B2 C3 D4
[combined subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// Outputs: A2 B3
[letters sendNext:@"A"];
[letters sendNext:@"B"];
[numbers sendNext:@"1"];
[numbers sendNext:@"2"];
[letters sendNext:@"C"];
[numbers sendNext:@"3"];
[letters sendNext:@"D"];
[numbers sendNext:@"4"];
/**
| letter | - A - B - - - C - - D
| number |- - - - 1 - 2 - 3 - - 4
| new | - - - - - - - A2 - - B3 -
-------------- time ----------------------->
[numbers sample:letters]的意思是,只有當(dāng)letters信號(hào)發(fā)出后,才需要獲取number的最新值,取出letters還沒(méi)有使用的最舊的信號(hào),合并發(fā)出
而當(dāng)發(fā)出A,B時(shí),number并沒(méi)有值,所以無(wú)法合并發(fā)出,當(dāng)發(fā)出C時(shí),獲得number的最新值2,取出還沒(méi)有使用過(guò)的A值,合并發(fā)出A2.
當(dāng)發(fā)出D時(shí),獲取number的最新值3,與還沒(méi)有使用過(guò)的B值,合并發(fā)出B3.
而不斷地發(fā)送number,是無(wú)法激活這個(gè)合并操作的.
*/
}