ReactiveObjC(一)

一些简单的用法

通知

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

UIControl

UIControl 的子类都可以使用下面的方法 监听 UIControlEvents 的事件

 [[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 可以转变信号

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

ignore 对信号进行过滤

 // 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 可以延迟倒计时

    //定时器
    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 -> RACSignal

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

字典

NSDictionary -> RACSequence -> RACSignal

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

 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];
    }];
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享