现在分为ReactiveObjC和ReactiveSwift
OC版本的使用
RAC 的核心是创建信号 ->发送信号->订阅信号
1. RACSignal 信号
/* 创建信号 */
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) {
/*发送信号 */
[subscriber sendNext:@"发送信号"];
return nil;
}];
/* 订阅信号 */
RACDisposable *disposable = [signal subscribeNext:^(id _Nullable x) {
NSLog(@"信号内容:%@", x);
}];
/* 取消订阅 */
[disposable dispose];
2. RACSubject 信号
/* 创建信号 */
RACSubject *subject = [RACSubject subject];
/* 发送信号 */
[subject sendNext:@"发送信号"];
/* 订阅信号(通常在别的视图控制器中订阅,与代理的用法类似) */
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"信号内容:%@", x);
}];
3. RACTuple 元祖
/* 创建元祖 */
RACTuple *tuple = [RACTuple tupleWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
/* 从别的数组中获取内容 */
RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:@[@"1", @"2", @"3", @"4", @"5"]];
/* 利用 RAC 宏快速封装 */
RACTuple *tuple = RACTuplePack(@"1", @"2", @"3", @"4", @"5");
NSLog(@"取元祖内容:%@", tuple[0]);
NSLog(@"第一个元素:%@", [tuple first]);
NSLog(@"最后一个元素:%@", [tuple last]);
4. 便利 Array 数组和 Dictionary 字典
/* 遍历数组 */
NSArray *array = @[@"1", @"2", @"3", @"4", @"5"];
[array.rac_sequence.signal subscribeNext:^(id _Nullable x) {
NSLog(@"数组内容:%@", x); // x 可以是任何对象
}];
/* 遍历字典 */
NSDictionary *dictionary = @{@"key1":@"value1", @"key2":@"value2", @"key3":@"value3"};
[dictionary.rac_sequence.signal subscribeNext:^(RACTuple * _Nullable x) {
RACTupleUnpack(NSString *key, NSString *value) = x; // x是一个元祖,这个宏能够将 key 和 value 拆开
NSLog(@"字典内容:%@:%@", key, value);
}];
/* 内容操作 */
NSArray *array = @[@"1", @"2", @"3", @"4", @"5"];
NSArray *newArray = [[array.rac_sequence map:^id _Nullable(id _Nullable value) {
NSLog(@"数组内容:%@", value);
return @"0"; //将所有内容替换为 0
}] array];
/* 内容快速替换 */
NSArray *array = @[@"1", @"2", @"3", @"4", @"5"];
NSArray *newArray = [[array.rac_sequence mapReplace:@"0"] array]; // 将所有内容替换为 0
5. 监听 TextField 的输入改变
/* 监听 TextField 的输入(内容改变就会调用) */
[[textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输入框内容:%@", x);
}];
/* 添加监听条件 */
[[textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return value.length > 5; //表示输入文字长度 > 5 时才会调用下面的 block
}] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输入框内容:%@", x);
}];
6. 监听 Button 点击事件
[[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@按钮被点击了", x); // x 是 button 按钮对象
}];
7. 登录按钮状态实时监听
RAC(submitButton, enabled) = [RACSignal combineLatest:@[phoneTextField.rac_textSignal, codeTextField.rac_textSignal] reduce:^id _Nullable(NSString * username, NSString * password){
return @(username.length && password.length);
}];
[RACObserve(submitButton, enabled) subscribeNext:^(id x) {
if ([x integerValue] == 1) {
[submitButton setBackgroundColor:rgba(239, 133, 49, 1)];
} else {
[submitButton setBackgroundColor:TQMColor238];
}
}];
8. 监听 Notification 通知事件
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidShowNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"%@键盘弹起", x); // x 是通知对象
}];
9. 代替 Delegate 代理方法
[[view rac_signalForSelector:@selector(btnClick)] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@" view中的按钮被点击了");
}];
10. 代替 KVO 监听
[[view rac_valuesForKeyPath:@"frame" observer:self] subscribeNext:^(id _Nullable x) {
NSLog(@"属性的改变:%@", x); // x 是监听属性的改变结果
}];
[RACObserve(view, frame) subscribeNext:^(id _Nullable x) {
NSLog(@"属性的改变:%@", x); // x 是监听属性的改变结果
}];
11. 代替 NSTimer 计时器
@interface ViewController ()
@property (nonatomic, strong) RACDisposable *disposable;
@end
/* 定义计时器监听 */
self.disposable = [[RACSignal interval:1.0 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDate * _Nullable x) {
NSLog(@"当前时间:%@", x); // x 是当前的系统时间
/*关闭计时器 */
[_disposable dispose];
}];
信号的处理 https://www.jianshu.com/p/aa155560bfed
1. map 映射
创建一个订阅者的映射并且返回数据
2. filter 过滤,可以筛选出需要的信号变化
3. take是获取,skip是跳过,这两个方法后面跟着的都是NSInteger。所以take 2就是获取前两个信号,skip 2就是跳过前两个。repeat是重复发送信号。
4. delay 延迟调用
5. throttle 节流。 throttle:0.5 只有0.5S内信号不产生变化才会发送请求,这样快速的输入也不会造成多次输出。
6. distinctUntilChanged 使RAC不会连续发送两次相同的信号
7. timeout 超时 timeout:2 2秒超时会给订阅者发送error信号
8. ignore 忽略信号,指定一个任意类型的量(可以是字符串,数组等),当需要发送信号时讲进行判断,若相同则该信号会被忽略发送。