- (void)concat { //创建信号A RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { //发送请求 NSLog(@"发送上部分的请求"); //发送信号 [subscriber sendNext:@"上部分数据"]; //发送完毕 //加上后就可以上部分发送完毕后发送下半部分信号 [subscriber sendCompleted]; return nil; }]; //创建信号B RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { //发送请求 NSLog(@"发送下部分的请求"); //发送信号 [subscriber sendNext:@"下部分数据"]; return nil; }]; //创建组合信号 //concat:按顺序去连接(组合) //注意:第一个信号必须调用sendCompleted RACSignal *concat = [signalA concat:signalB]; //订阅组合信号 [concat subscribeNext:^(id x) { //既能拿到A信号的值,又能拿到B信号的值 NSLog(@"%@", x); }]; }
- (void)then { //创建信号A RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { //发送请求 NSLog(@"发送上部分的请求"); //发送信号 [subscriber sendNext:@"上部分数据"]; //发送完毕 //加上后就可以上部分发送完毕后发送下半部分信号 [subscriber sendCompleted]; return nil; }]; //创建信号B RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { //发送请求 NSLog(@"发送下部分的请求"); //发送信号 [subscriber sendNext:@"下部分数据"]; return nil; }]; //thenSignal组合信号 //then:会忽略掉第一个信号的所有值 RACSignal *thenSignal = [signalA then:^RACSignal *{ //返回的信号就是需要组合的信号 return signalB; }]; //订阅信号 [thenSignal subscribeNext:^(id x) { NSLog(@"%@", x); }]; /* 结果: 发送上部分的请求 发送下部分的请求 下部分数据 */ }
- (void)merge { //创建信号A RACSubject *signalA = [RACSubject subject]; //创建信号B RACSubject *signalB = [RACSubject subject]; //组合信号 RACSignal *mergeSignal = [signalA merge:signalB]; //订阅信号 [mergeSignal subscribeNext:^(id x) { //任意一个信号发送内容都会来到这个block NSLog(@"%@", x); }]; //发送数据 [signalB sendNext:@"下部分"]; [signalA sendNext:@"上部分"]; /*结果:下部分上部分*/ }
- (void)zipWith { //创建信号A RACSubject *signalA = [RACSubject subject]; //创建信号B RACSubject *signalB = [RACSubject subject]; //压缩成一个信号 //当一个界面多个请求时,要等所有的请求都完成才能更新UI //打印顺序跟组合顺序有关,跟发送顺序无关 RACSignal *zipSignal = [signalA zipWith:signalB]; //订阅信号 [zipSignal subscribeNext:^(id x) { NSLog(@"%@", x); }]; //发送信号 [signalA sendNext:@"HMJ"]; [signalB sendNext:@"GQ"]; /* 结果 <RACTuple: 0x7ffd8351f120> ( HMJ, GQ ) */ }
- (void)combineLatest { RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@"A"]; return nil; }]; RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@"B"]; return nil; }]; //把两个信号组合成一个信号 RACSignal *combineSignal = [signalA combineLatestWith:signalB]; //订阅组合信号 [combineSignal subscribeNext:^(id x) { NSLog(@"%@", x); }]; }
- (void)combineLatestWithReduce { /*登录界面:两个文本框(账户,密码) + 一个登录按钮*/ //组合多个信号 //reduce:聚合 //reduceBlock的参数与组合的信号一一对应,可以在reduce:后拿到信号的值 RACSignal *combineSignal = [RACSignal combineLatest:@[_accountName.rac_textSignal, _passWord.rac_textSignal] reduce:^id(NSString *account, NSString *pwd){ //block:只要源信号发送内容就会调用,组合成新的一个值 //聚合的值就是组合信号的内容 return @(account.length && pwd.length); }]; //订阅信号 // [combineSignal subscribeNext:^(id x) { // self.loginBtn.enabled = [x boolValue]; // // }]; //等同于 RAC(self.loginBtn, enabled) = combineSignal; }
原文:http://www.cnblogs.com/HMJ-29/p/4943997.html