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);}];
关于信号的合并
- concat : 把signalA拼接到signalB后,signalA发送完成,signalB才会被激活
- merge : 把多个信号合并为一个信号,任何一个信号有新值的时候就会调用
- 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
- ReactiveObjC的使用
- ReactiveObjc的使用总结
- iOS-ReactiveObjC 的基本使用(二)
- iOS-ReactiveObjC 的高级使用(二)
- ReactiveObjC学习笔记
- ReactiveObjC 响应函数式框架 简单实用
- 将ReactiveObjC整成动态库来调用
- 函数响应式编程及ReactiveObjC学习笔记 (-)
- 函数响应式编程及ReactiveObjC学习笔记 (二)
- GUID使用的使用
- ${}的使用
- 的使用
- @[],@()的使用
- ->的使用
- +、-、*、/、%的使用
- &&的使用
- %:的使用
- Makefile中使用$$的使用
- JavaScript的异常处理
- Halcon模版匹配算子解析---超级详细的create_shape_model和find_shape_model算子的详细讲解
- 去硅谷创业,你至少有八个理由说服自己
- 共享单车第三名的另一套生存法则丨价值观点
- 如何快速转载CSDN中的博客
- ReactiveObjC的使用
- 文章标题C#实现json与dt、array的转换
- 利用存储过程,将数据库里面的code的值转换成 中文,报表的时候用
- C++ 学习笔记
- 程序员必备算法——排列组合
- Xamarin控件使用之GridView
- cipher命令(转)
- 一个小白安装Win10、CentOS 7双系统的经历,win10centos(亲测无误)
- 游戏倒计时源码