美文网首页ReactiveCocoa相关ReactiveCocoa研究待读
ReactiveCocoa深入学习1 - Merge(合并)

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

作者: 没故事的卓同学 | 来源:发表于2015-09-16 01:15 被阅读3931次

看了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(@"两个请求都已完成!");

}];

相关链接:

ReactiveCocoa入门教程(下)

相关文章

网友评论

  • 世界的一缕曙光:你好,能看下我这样写有问题吗?
    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;
    }];

本文标题:ReactiveCocoa深入学习1 - Merge(合并)

本文链接:https://www.haomeiwen.com/subject/ghjmcttx.html