ReactiveCocoa 学习

169 阅读3分钟

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