ReactiveObjC(一)

一些简单的用法

通知

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"lala" object:nil] subscribeNext:^(NSNotification * _Nullable x) {
        NSLog(@"NSNotification = %@",x);
    }];
复制代码

UIControl

UIControl 的子类均可以使用下面的方法 监听 UIControlEvents 的事件objective-c

[[self.button rac_signalForControlEvents:UIControlEventTouchUpInside]  subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"x  == %@",x);
        
        [[NSNotificationCenter defaultCenter] postNotificationName:@"lala" object:@"map"];
    }];
复制代码

UITextFiled

filter 过滤信号, 只有当 value.length > 5 符合 BOOL 的值才能订阅到编程

// filter 过滤信号 符合添加的信号能够订阅到
    [[self.textFiled.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
        return value.length > 5;
    }] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"length > 5 %@",x);
    }];
复制代码

map 能够转变信号markdown

// 对信号进行组合
    [[self.textFiled.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
        return [NSString stringWithFormat:@"map %@",value];
    }] subscribeNext:^(id  _Nullable x) {
        NSLog(@"map == %@",x);
    }];
复制代码

ignore 对信号进行过滤ide

// ignore 直接忽略某个信号
    [[self.textFiled.rac_textSignal ignore:@"1"] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"ignore 1 == %@",x);
    }];
复制代码

interval

使用 take 转换信号,能够编程倒计时函数

//定时器
    RACSignal *intervalSignam = [RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]];
    // 只取前三个 也就是倒计时3秒
    RACSignal *counter = [intervalSignam take:3];
    
		// 只会显示前三个值
    [counter subscribeNext:^(id  _Nullable x) {
        NSLog(@"interval = %@",x);
    }];
复制代码

使用 delay 能够延迟倒计时oop

//定时器
    RACSignal *intervalSignam = [RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]];
    // 只取前三个 也就是倒计时3秒
    RACSignal *counter = [[intervalSignam take:3] delay:2];
    
    // delay
    [counter subscribeNext:^(id  _Nullable x) {
        NSLog(@"interval = %@",x);
    }] ;

复制代码

遍历

NSArray -> RACSequence -> RACSignalpost

NSArray *array = @[@1,@2,@3,@4,@5];
[array.rac_sequence.signal subscribeNext:^(id  _Nullable x) {
    NSLog(@"array = %@",x);
}];
复制代码

字典学习

NSDictionary -> RACSequence -> RACSignalui

字典订阅到的结果是 RACTuple 元祖类atom

NSDictionary*dictionary=@{@"key1":@"value1",@"key2":@"value2",@"key3":@"value3"};

    [dictionary.rac_sequence.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"dictionary = %@",x);
    }];
    
    [dictionary.rac_keySequence.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"dictionary_key = %@",x);
    }];
    
    [dictionary.rac_valueSequence.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"dictionary_value = %@",x);
    }];
    
复制代码

RACSubject

RACSubject 能够实现一些相似 Block 中的经常使用的用法

@interface DSButtonView : UIView
@property (nonatomic, strong) UIButton *sender;
@property (nonatomic, strong) RACSubject *subjtct;
@end

复制代码
@implementation DSButtonView

-(instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        
    }
    return self;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    if (self.subjtct) {
        [self.subjtct sendNext:@"666"];
    }
}
复制代码

在使用的地方确认

self.but.subjtct = [RACSubject subject];
[self.but.subjtct subscribeNext:^(id  _Nullable x) {
    NSLog(@"subject == %@",x);
}];
复制代码

KVO

RACObserve

RACObserve 能够监听属性的变化,即便是非 id 类型

@property(nonatomic, assign) NSInteger counter;
复制代码
[RACObserve(self, counter) subscribeNext:^(id  _Nullable x) {
    NSLog(@"x == %@",x);
}];
复制代码

KeyPath

经过 keyPath 监听属性的变化

[[self.but rac_valuesForKeyPath:@"frame" observer:self] subscribeNext:^(id  _Nullable x) {
        NSLog(@"frame == %@",x);
    }];
复制代码

事件绑定

经过 RAC(<#TARGET, ...#>) 这个宏,将属性相互绑定,

将 self.view 的背景颜色 和 textFiled 输入的文本信息相互绑定

RAC(self.view,backgroundColor) = [self.textFiled.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
        return [value isEqualToString:@"666"] ? [UIColor redColor]: [UIColor greenColor];
    }];
复制代码

经常使用的函数

bind

distinctUntilChanged

忽略重复的信号,在使用 rac_textSignal 发现会发出两个一样的信号

[[self.textFiled.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
    return [NSString stringWithFormat:@"map %@",value];
}] subscribeNext:^(id  _Nullable x) {
    NSLog(@"map == %@",x);
}];
复制代码

输出

2021-05-06 14:11:43.830551+0800 ptf[597:150589] map == map 在一块儿
2021-05-06 14:11:43.832338+0800 ptf[597:150589] map == map 在一块儿
复制代码

使用 distinctUntilChanged在信号不同的时候才发出订阅, 以下

[[[self.textFiled.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
    return [NSString stringWithFormat:@"map %@",value];
}] switchToLatest]  subscribeNext:^(id  _Nullable x) {
    NSLog(@"map == %@",x);
}];
复制代码

优秀文章

ReactiveObjC学习笔记

相关文章
相关标签/搜索