美文网首页
CocoaReactive——温故知新

CocoaReactive——温故知新

作者: Roy_Gao | 来源:发表于2017-02-19 11:33 被阅读109次

    RACSignal的理解

    信号是一个发送「一连串」值的物体,根据外界条件的改变,不断地有相应地输出。
    类似与UITextField中输入内容的变化,不断的在代理方法中被监听到:
    -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

    在苹果提供的原生框架中,可以起到类似监听效果的方法有:

    • 代理
    • 通知
    • 观察者
    • Block
    • Target/Action事件观察

    但这样的监听实现起来有如下弱点:

    • 鉴于方法之多,不统一!
    • 大部分设置监听关系与处理监听结果的代码不在一起,连贯性不佳!

    好在ReactiveCocoa帮我们统一了以上监听方式,并且克服了其弱点!!

    监听方法的天下一统!!

    For example:

    // 1.代替代理
    // 需求:自定义redView,监听红色view中按钮点击
    // 之前都是需要通过代理监听,给红色View添加一个代理属性,点击按钮的时候,通知代理做事情
    // rac_signalForSelector:把调用某个对象的方法的信息转换成信号,就要调用这个方法,就会发送信号。
    // 这里表示只要redV调用btnClick:,就会发出信号,订阅就好了。
    [[redV rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
        NSLog(@"点击红色按钮");
    }];
    // 2.KVO
    // 把监听redV的center属性改变转换成信号,只要值改变就会发送信号
    // observer:可以传入nil
    [[redV rac_valuesAndChangesForKeyPath:@"center" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {
    
        NSLog(@"%@",x);
    
    }];
    
    // 3.监听事件
    // 把按钮点击事件转换为信号,点击按钮,就会发送信号
    [[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
    
        NSLog(@"按钮被点击了");
    }];
    
    // 4.代替通知
    // 把监听到的通知转换信号
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
        NSLog(@"键盘弹出");
    }];
    
    // 5.监听文本框的文字改变
       [_textField.rac_textSignal subscribeNext:^(id x) {
       NSLog(@"文字改变了%@",x);
       }];
    
    // 6.处理多个请求,都返回结果的时候,统一做处理.
    RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    
        // 发送请求1
        [subscriber sendNext:@"发送请求1"];
        return nil;
    }];
    
    RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 发送请求2
        [subscriber sendNext:@"发送请求2"];
        return nil;
    }];
    
    // 使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。
    [self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];
    }
    
    // 更新UI
    - (void)updateUIWithR1:(id)data r2:(id)data1
    {
    NSLog(@"更新UI%@  %@",data,data1);
    }
    

    更牛逼的是,RACSignl信号或者RACSignl信号之间还能过滤, 转换, 分解和合并成新的信号!
    想想这样的场景吧:登陆页面中,用户名作为信号1,密码作为信号2,两个信号合并成新的信号3—控制着登陆按钮的透明度/是否触发...

    订阅者

    简言之, 订阅者就是一段代码, 它等待信号给它发送一些值, 然后订阅者就能处理这些值了. (它也可以作用于 “complete” 和 “error” 事件. )

    归纳

    iOS中实现监听的方案

    • 代理
    • 通知
    • 观察者
    • Block
    • Target/Action事件观察
    • RAC

    RAC优点

    • 能替代其他五种方案!
    • 从设置监听关系到处理监听值具有无法想象的连贯性!
    • RACSignl信号之间还能过滤, 转换, 分解和合并成新的信号!

    参考文章:
    [ReactiveCocoa and MVVM, an Introduction]
    [最快让你上手ReactiveCocoa之基础篇]

    相关文章

      网友评论

          本文标题:CocoaReactive——温故知新

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