美文网首页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