函数响应式编程—ReactiveCocoa 使用入门
2016-01-06 22:30
627 查看
安装ReactiveCocoa
新建一个OC工程,用终端进入工程目录,使用CocoaPods安装ReactiveCocoa。
搭建一个简单的登陆界面
把需要用到的空间拉成属性。准备工作就算完成了
- 1.初步了解一下
首先添加头文件
然后在ViewController里添加如下代码。
上面的代码就是reactiveCocoa最基本的应用。可以看到,每当你输入一个字符,都会把当前的文本打印出来,不需要代理,多么简洁。
self.nameTextfield.rac_textSignal : 产生了一个文本信号,输出的信号是text文本。由于可以确定输出的信号是字符串,所以可以把(id x)改成(NSString *str)
subscribeNext 接收前面传入的信号。
2.判断输入的字符是否符合一定要求,比如长度大于3,把文本打印出来
上面的代码,只有你输入的字符长度超过了3,才会打印字符串。可以看到,和1比起来,多了一个filter,你可以把这个想象成一个过滤网。对于前面传过来的文本信号,要经过filter的判断,符合要求,那么信号就可以往下一级传递。
3.map 信号转换
map: 可以把前面传来的数据类型转换成其他我们需要的类型。
在上面的代码中 最开始的文本信号发送给map,map方法把文本信号转换成NSNumber类型,传给filter判断(filter的传入的变量变成了NSNumber)。filter判断成功后让map产生的信号通过,进入subscribeNext。整个信号传递的过程就是这样的。
4.输入有效的时候,改变相应输入框的背景色
ReactiveCocoa 提供了一个宏(RAC(TARGET, …))来更好的完成上面的事情。RAC有两个参数,第一个是目标对象,第二个是属性名,每次型号产生一个next事件,传递过来的值都会应用到该对象上。
5.两个信号合并
分别生成两个单独的信号,然后合并这两个单独的信号,根据合并后的信号来处理业务逻辑。
4000
新建一个OC工程,用终端进入工程目录,使用CocoaPods安装ReactiveCocoa。
搭建一个简单的登陆界面
把需要用到的空间拉成属性。准备工作就算完成了
@property (weak, nonatomic) IBOutlet UITextField *nameTextField; @property (weak, nonatomic) IBOutlet UITextField *passwordTextField; @property (weak, nonatomic) IBOutlet UIButton *loginBtn;
- 1.初步了解一下
首先添加头文件
#import <ReactiveCocoa/ReactiveCocoa.h>
然后在ViewController里添加如下代码。
[self.nameTextField.rac_textSignal subscribeNext:^(id x) { NSString *str = (NSString*)x; NSLog(@"%@",str); }];
上面的代码就是reactiveCocoa最基本的应用。可以看到,每当你输入一个字符,都会把当前的文本打印出来,不需要代理,多么简洁。
self.nameTextfield.rac_textSignal : 产生了一个文本信号,输出的信号是text文本。由于可以确定输出的信号是字符串,所以可以把(id x)改成(NSString *str)
subscribeNext 接收前面传入的信号。
2.判断输入的字符是否符合一定要求,比如长度大于3,把文本打印出来
[[self.nameTextField.rac_textSignal filter:^BOOL(NSString *str) { return str.length>3; }] subscribeNext:^(NSString *x) { NSLog(@"%@",x); }];
上面的代码,只有你输入的字符长度超过了3,才会打印字符串。可以看到,和1比起来,多了一个filter,你可以把这个想象成一个过滤网。对于前面传过来的文本信号,要经过filter的判断,符合要求,那么信号就可以往下一级传递。
3.map 信号转换
[[[self.nameTextField.rac_textSignal map:^id(NSString *value) { return @(value.length); }] filter:^BOOL(NSNumber *value) { return [value intValue]>3; }] subscribeNext:^(NSNumber *x) { NSLog(@"%@",x); }];
map: 可以把前面传来的数据类型转换成其他我们需要的类型。
在上面的代码中 最开始的文本信号发送给map,map方法把文本信号转换成NSNumber类型,传给filter判断(filter的传入的变量变成了NSNumber)。filter判断成功后让map产生的信号通过,进入subscribeNext。整个信号传递的过程就是这样的。
4.输入有效的时候,改变相应输入框的背景色
RACSignal *nameTextFieldSignal = self.nameTextField.rac_textSignal; //生成一个单独的信号 RAC(self.nameTextField,backgroundColor) = [nameTextFieldSignal map:^id(NSString* value) { return value.length>3?[UIColor yellowColor]:[UIColor whiteColor]; }];
ReactiveCocoa 提供了一个宏(RAC(TARGET, …))来更好的完成上面的事情。RAC有两个参数,第一个是目标对象,第二个是属性名,每次型号产生一个next事件,传递过来的值都会应用到该对象上。
5.两个信号合并
分别生成两个单独的信号,然后合并这两个单独的信号,根据合并后的信号来处理业务逻辑。
//两个信号 RACSignal *nameSignals = self.nameTextField.rac_textSignal; RACSignal *passwordSignal = self.passwordTextField.rac_textSignal; //改变背景色 RAC(self.nameTextField,backgroundColor) = [nameSignals map:^id(NSString* value) { return value.length>3 ? [UIColor yellowColor]:[UIColor whiteColor] ; }]; RAC(self.passwordTextField,backgroundColor) = [passwordSignal map:^id(NSString* value) { return value.length>3 ? [UIColor yellowColor]:[UIColor whiteColor] ; }]; //合并两个信号 RACSignal *twoSignals = [RACSignal combineLatest:@[nameSignals,passwordSignal] reduce:^id(NSString *name,NSString* password){ return @((name.length>3)&&(password.length>3)); }]; // 合并后的信号输出 [twoSignals subscribeNext:^(NSNumber *x) { self.loginBtn.enabled = [x boolValue]; }];
4000
相关文章推荐
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数
- Lua中实现sleep函数功能的4种方法
- Lua函数用法研究
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
- PowerShell函数简明教程
- SQL Server中的RAND函数的介绍和区间随机数值函数的实现