ReactiveObjC(RAC)是一个函数响应式编程框架。RAC用信号(类名为RACSignal)来代替和处理各种变量的变化和传递。
其核心:创建信号->订阅信号(subscribeNext)->发送信号
通过信号signals的传输,重新组合和响应,软件代码的编写逻辑思路将变得更清晰紧凑,有条理,而不再需要对变量的变化不断的观察更新。
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 返回true 时,才会调用subscribeNext的 block*/
[[textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
// 表示输入文字长度 > 5 时才会调用下面的 block
return value.length > 5;
}] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输入框内容:%@", x);
}];
//这里注意用的是 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);
}];
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);
}];