您的位置:首页 > Web前端 > React

函数响应式编程—ReactiveCocoa 使用入门

2016-01-06 22:30 627 查看
安装ReactiveCocoa

新建一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  响应式 函数