ReactiveObjC的使用

3 篇文章 0 订阅

ReactiveObjC
下载地址
官网

简介

ReactiveObjC(RAC)是一个函数响应式编程框架。RAC用信号(类名为RACSignal)来代替和处理各种变量的变化和传递。
其核心:创建信号->订阅信号(subscribeNext)->发送信号
通过信号signals的传输,重新组合和响应,软件代码的编写逻辑思路将变得更清晰紧凑,有条理,而不再需要对变量的变化不断的观察更新。

信号-Signal机制

Signal 的三种事件类型

1.Next - sendNext
2.Complete - sendCompleted
3.Error-sendError

监听事件(按钮点击)

 [[loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
 //这里是点击事件
        [self action_Login];
    }];

//信号

  loginBtn.rac_command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
        NSLog(@"登录按钮 clicked");
        return [RACSignal empty];
    }];

监听文本框的文字改变

[_textField.rac_textSignal subscribeNext:^(id x) {
NSLog(@"文字改变了%@",x);
}];
添加监听条件:filter
/* 添加监听条件 :当 filter 返回true 时,才会调用subscribeNext的 block*/
[[textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
// 表示输入文字长度 > 5 时才会调用下面的 block
    return value.length > 5; 

}] subscribeNext:^(NSString * _Nullable x) {

     NSLog(@"输入框内容:%@", x);
}];

关于信号的合并

  1. concat : 把signalA拼接到signalB后,signalA发送完成,signalB才会被激活
  2. merge : 把多个信号合并为一个信号,任何一个信号有新值的时候就会调用
  3. combineLatest 方法则可以结合多个信号量,最终得到按钮是否可用的结果。
//这里注意用的是 merge 不是 concat,concat 必须是第一个signal 为真时按一定顺序拼接信号,当多个信号发出的时候,有顺序的接收信号
    [[[uitf_name.textField.rac_textSignal merge:uitf_password.textField.rac_textSignal] filter:^BOOL(id  _Nullable value) {
        BOOL flag = uitf_password.textField.text.length >= 5 && uitf_name.textField.text.length >= 5;
        if (!flag) {
            loginBtn.userInteractionEnabled = NO;
            [loginBtn setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal];
        }
        return flag;
    }] subscribeNext:^(id  _Nullable x) {
        [loginBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        loginBtn.userInteractionEnabled = YES;
    }];

上面显得麻烦,可以使用 RAC()如下,可以达到相同的效果.
只有 用户名 和 密码 输入框内容都>=5 时,登录 按钮才可以点击,而且状态是实时监听的

  RAC(loginBtn,enabled) = [RACSignal combineLatest:@[uitf_name.textField.rac_textSignal,uitf_password.textField.rac_textSignal] reduce:^id _Nullable{
        return @(uitf_name.textField.text.length >= 5 && uitf_password.textField.text.length >= 5);

    }];

map 方法会将拿到的信号映射成新的内容

 NSArray *array = @[@"1",@"2",@3,@4,@5];
 //遍历数组
    [array.rac_sequence.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);

    }];
   //把 array 数组的元素全部替换成0字符串
    NSArray *newArray = [[array.rac_sequence map:^id _Nullable(id  _Nullable value) {
        NSLog(@"数组内容 :%@",value);
        return @"0";

    }] array];
    NSLog(@"新数组 : %@",newArray);
    //快速替换mapReplace

    NSArray *newArray1 = [[array.rac_sequence mapReplace:@"1"]array];

//RACTuple 元组
    NSDictionary *dict = @{@"name":@"yanyanyan",@"brief":@"girl",@"birthday":@"19900217"};
    [dict.rac_sequence.signal subscribeNext:^(RACTuple *  _Nullable x) {
        RACTupleUnpack(NSString *key , NSString *value) = x;
        NSLog(@"%@ :%@",key,value);
    }];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值