ReactiveObjC的使用

来源:互联网 发布:手机vpn服务器域名 编辑:程序博客网 时间:2024/06/01 08:00

ReactiveObjC
下载地址
官网

简介

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

信号-Signal机制

Signal 的三种事件类型

1.Next - sendNext2.Complete - sendCompleted3.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);    }];
原创粉丝点击