ReactiveCocoa 使用介绍
RAC(ReactiveCocoa)介绍 基本介绍
UIButton 点击事件的 rac 引用
[[self.testButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"RAC按钮点击了");
NSLog(@"%@",x);
}];
UITapGestureRecognizer 点击
[tap.rac_gestureSignal subscribeNext:^(__kindof UIGestureRecognizer * _Nullable x) {
//点击事件响应的逻辑
NSLog(@"%@",x);
}];
替代KVO 属性 (最常用),实时监听某个属性的变化,刷新UI
[RACObserve(self.testLable, text) subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
替代 Delegate (需要设置代理实现的 self)
[[self rac_signalForSelector:@selector(textFieldDidBeginEditing:) fromProtocol:@protocol(UITextFieldDelegate)] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@"textField delegate == %@",x);
}];
self.testTextField.delegate = self;
替代通知 [NSNotificationCenter defaultCenter] 可以直接在当前的 Block 中调用
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidHideNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"%@",x);
}];
RAC(ReactiveCocoa)介绍(二)——map映射
RAC中包含两种映射方法map、flattenMap,映射方法是将原信号中的内容映射成新的指定内容。
flattenMap方法和map方法都有一个带参数value的block作为这个方法的参数。不同的是,flattenMap方法通过调用block(value)来创建一个新的方法。它可以灵活的定义新创建的信号。而map方法,将会创建一个和原来一模一样的信号,只不过新的信号传递的值变成了block(value)
[[self.testTextField.rac_textSignal flattenMap:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {
//自定义返回内容
return [RACReturnSignal return:[NSString stringWithFormat:@"flattenMap自定义了返回信号:%@",value]];
}] subscribeNext:^(id _Nullable x) {
NSLog(@"flattenMap---%@",x);
}];
[[self.testTextField.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
return [NSString stringWithFormat:@"map自定义了返回信号:%@",value];
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
RAC(ReactiveCocoa)介绍(三)——信号过滤
信号过滤,在RAC中会对RACSignal信号发送的信息进行过滤,只有符合判断要求的信号才能被订阅到。 信号过滤有以下几种方法:filter、ignore、ignoreValue、distinctUntilChanged
filter方法:
@weakify(self);
[[self.testTextField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
///BOOL值来判断是否过滤掉信号
//过滤判断条件
@strongify(self)
if (self.testTextField.text.length >= 6) {
self.testTextField.text = [self.testTextField.text substringToIndex:6];
self.testLable.text = @"已经到6位了";
self.testLable.textColor = [UIColor redColor];
}
return value.length <= 6; ///当 return NO 的时候,不进入下一步的操作
}] subscribeNext:^(NSString * _Nullable x) {
//订阅逻辑区域
NSLog(@"filter过滤后的订阅内容:%@",x);
}];
ignoreValue与ignore ignoreValue与ignore都是基于filter方法封装的。 ignoreValue是直接将指定的信号全部过滤掉,筛选条件全部为NO,将所有信号变为空信号。 ignore是将符合指定字符串条件的信号过滤掉。
[[self.testTextField.rac_textSignal ignoreValues] subscribeNext:^(id _Nullable x) {
//将self.testTextField的所有textSignal全部过滤掉
}];
[[self.testTextField.rac_textSignal ignore:@"1"] subscribeNext:^(id _Nullable x) {
//将self.testTextField的textSignal中字符串为指定条件的信号过滤掉
}];
distinctUntilChanged 用于判断当前信号的值跟上一次的值相同,若相同时将不会收到订阅信号。
- (void)distinctUntilChanged
{
RACSubject *subject = [RACSubject subject];
[[subject distinctUntilChanged] subscribeNext:^(id _Nullable x) {
NSLog(@"distinctUntilChanged-send:%@",x);
}];
[subject sendNext:@1111];
[subject sendNext:@2222];
[subject sendNext:@2222]; //和上次的信号一样就不会执行
[subject sendNext:@1111];
}
2022-04-21 18:59:47.944559+0800 ReactiveObjc[69298:2255690] distinctUntilChanged-send:1111 2022-04-21 18:59:49.063194+0800 ReactiveObjc[69298:2255690] distinctUntilChanged-send:2222 2022-04-21 18:59:49.887426+0800 ReactiveObjc[69298:2255690] distinctUntilChanged-send:1111