看了rac的入门,项目里也已经开始使用,但是还是只用到了一些最基础的功能。决定不定期的深入的学习一些rac的技巧。
这样好用的ReactiveCocoa,根本停不下来 最近看了这篇文章,写了一些用法但是介绍的比较简略,所以打算挑一些详细说明。今天来说一下merge。
/// Sends the latest `next` from any of the signals.
/// Returns a signal that passes through values from each of the given signals,
/// and sends `completed` when all of them complete. If any signal sends an error,
/// the returned signal sends `error` immediately.
+ (RACSignal *)merge:(id)signals;
这个是merge方法代码上的说明:
合并中的任何一个signal触发,都会传送到合并后的signal;
当合并的一组signal都发送了完成后,当前signal的发送complete的消息。
下面进入demo时间。
搭建一个有三个switch的界面。
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UISwitch *swResult;
@property (nonatomic,strong) id leftSubscriber;
@property (nonatomic,strong) id rightSubscriber;
@end
声明了两个subscriber的属性,以及最下方的一个开关关联为swResult。
接着在viewDidLoad中初始化两个subsrciber,一个代表左边的开关,一个是右边的开关
RACSignal* leftSignal=[RACSignal createSignal:^RACDisposable *(idsubscriber) {
_leftSubscriber=subscriber;
return nil;
}];
RACSignal* rightSignal=[RACSignal createSignal:^RACDisposable *(idsubscriber){
_rightSubscriber=subscriber;
return nil;
}];
接着merge这两个signal,这里订阅了completed事件,收到completed消息时,设置最下面的开关打开(初始时三个开关的状态都是off)。
[[RACSignal merge: @[ leftSignal,rightSignal ] ] subscribeCompleted:^{
_swResult.on=YES;
}];
然后设置左右两个开关的valueChanged action
- (IBAction)leftSwitchValueChanged:(id)sender {
[_leftSubscriber sendCompleted];
}
- (IBAction)rightSwitchValueChanged:(id)sender {
[_rightSubscriber sendCompleted];
}
操作界面就会如下:
当两个开关都打开后,merge后的signal就会收到completed的消息。于是最下的一个开关就被打开。
举一个使用场景,如果要在某几个网络请求都完成后执行一些操作,使用merge就很合适。
比如这样:
[[RACSignal merge:@[ [client fetchUserRepos], [client fetchOrgRepos] ]]
subscribeCompleted:^{
NSLog(@"两个请求都已完成!");
}];
相关链接:
网友评论
RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[[switch1 rac_signalForControlEvents:UIControlEventValueChanged] subscribeNext:^(id _Nullable x) {
[subscriber sendCompleted];
}];
return nil;
}];
RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[[switch2 rac_signalForControlEvents:UIControlEventValueChanged] subscribeNext:^(id _Nullable x) {
[subscriber sendCompleted];
}];
return nil;
}];
[[RACSignal merge:@[signal1, signal2]] subscribeCompleted:^{
switch3.on = YES;
}];