ReactiveCocoa深入学习1 - Merge(合并)

看了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的界面。

ReactiveCocoa深入学习1 - Merge(合并)_第1张图片

@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];

}

操作界面就会如下:


ReactiveCocoa深入学习1 - Merge(合并)_第2张图片

当两个开关都打开后,merge后的signal就会收到completed的消息。于是最下的一个开关就被打开。


举一个使用场景,如果要在某几个网络请求都完成后执行一些操作,使用merge就很合适。

比如这样:

[[RACSignal merge:@[ [client fetchUserRepos], [client fetchOrgRepos] ]]

subscribeCompleted:^{

NSLog(@"两个请求都已完成!");

}];

相关链接:

ReactiveCocoa入门教程(下)

你可能感兴趣的:(ReactiveCocoa深入学习1 - Merge(合并))