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學習筆記

相關文章
相關標籤/搜索