码迷,mamicode.com
首页 > 其他好文 > 详细

记录一下RAC的使用

时间:2019-06-28 15:18:01      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:odata   方便   uil   path   class   反向传值   gray   中文   not   

1  常规的对数组的操作,包括遍历、刷选、映射、替换

 // 遍历
NSArray * array = @[@"1",@"2",@"3",@"4",@"5",@"6"]; [array.rac_sequence.signal subscribeNext:^(id _Nullable x) { NSLog(@"数组内容:%@", x); }]; // 刷选 NSArray *filter = [[array.rac_sequence filter:^BOOL(id value) { return [value integerValue] > 2; }] array]; NSLog(@"filter:%@",filter); // (3,4,5,6) // 映射 NSArray *map = [[array.rac_sequence map:^id(id value) { NSInteger a = [value integerValue] * [value integerValue]; return [NSString stringWithFormat:@"%ld", a]; }] array]; NSLog(@"map:%@",map); //(1,4,9,16,25,36)


   // 数组替换所有元素

    NSArray * array1 = @[@"1",@"2",@"3",@"4",@"5",@"6"];

    NSArray * newArray = [[array1.rac_sequence mapReplace:@"99"] array];

    NSLog(@"%@",newArray);

 

 

2 节流  throttle   

 表示 指定时间间隔内,不再发送信号  这里添加 throttle, 表示在 1 秒内 text 没有改变时,才会进行搜索请求

 UITextField *textfield;
    [[[textfield rac_textSignal]
      throttle:1]
     subscribeNext:^(id x) {
         NSLog(@"开始搜索请求==%@", x);
     }];

 

3  事件处理    KVO监听   通知等

 UITextField * textF;
    //实时监听输入框中文字的变化
    [[textF rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"输入框的内容--%@",x);
    }];
    
    //UITextField的UIControlEventEditingChanged事件,免去了KVO
    [[textF rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"%@",x);
    }];
    //添加监听条件
    [[textF.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
        return [value isEqualToString:@"100"];//此处为判断条件,当输入的字符为100的时候执行下面方法
    }]subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"输入框的内容为%@",x);
    }];
    
    UIButton *loginBtn;
    //监听点击事件
    [[loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"%@",x);//x为一个button对象,别看类型为UIControl,继承关系UIButton-->UIControl-->UIView-->UIResponder-->NSObject
        x.frame = CGRectMake(100, 210, 200, 300);
    }];
    //KVO监听按钮frame的改变
    [[loginBtn rac_valuesAndChangesForKeyPath:@"frame" options:(NSKeyValueObservingOptionNew) observer:self] subscribeNext:^(RACTwoTuple<id,NSDictionary *> * _Nullable x) {
        NSLog(@"frame改变了%@",x);
    }];
    
    //定时器
    [[RACSignal interval:2.0 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDate * _Nullable x) {
        NSLog(@"你好哇。");
        //这里面的方法2秒一循环
    }];
    
    //通知。。。不需要注销了
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidShowNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
        NSLog(@"%@ 键盘弹起", x); // x 是通知对象
    }];

 

4 反向传值,也可以使用block  代理  通知,但是使用RAC最简单

在controller中

 SubView *subView = [[SubView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    subView.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:subView];
    
    [[subView rac_signalForSelector:@selector(sendValues:data:)] subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"===111%@",x);
    }];

在SubView.h中声明这个方法

- (void)sendValues:(NSString *)type data:(NSDictionary *)dicc;

在SubView.m中调用这个方法

- (void)btnAction:(UIButton *)sender
{
    [self sendValues:@"111" data:@{@"key" : @"values"}];
}

 

 

5  RACSubject使用

// 创建信号
    RACSubject *subject = [[RACSubject alloc] init];
    
    // 订阅信号
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"==%@",x);
    }];
    // 发送信号
    [subject sendNext:@"今天天气还是一如既往的好,希望明天也是如此"];

 

6  关于多请求的处理,其实可以使用GCD等方式,但是这里使用RAC还是比较方便的

    

- (void)demo7
{
    RACSignal *single1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        // 1:请求数据
        // 2:发送数据
        [subscriber sendNext:@"single1"];
        return nil;
    }];
   
    RACSignal *single2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        // 1:请求数据
        // 2:发送数据
        [subscriber sendNext:@"single2"];
        return nil;
    }];
    
    // 订阅信号
    [single1 subscribeNext:^(id  _Nullable x) {
        NSLog(@"------处理1..%@",x);
    }];
    
    [single2 subscribeNext:^(id  _Nullable x) {
        NSLog(@"------处理2。。%@",x);
    }];
    
    // 当数组中所有信号都发送了数据,才会执行selector,必须带参,参数是sendNext发送过来的,必须和信号一一对应
    // 参数:每个信号发送的数据,这里必须要带参数,不然会崩溃
    [self rac_liftSelector:@selector(updateUIOneData:TwoData:) withSignalsFromArray:@[single1,single2]];
}

- (void)updateUIOneData:(id)x1 TwoData:(id)x2
{
    NSLog(@"更新UI:%@----%@",x1,x2);
}

 

 

7. 使用宏

 UILabel *myLabel;
    // 监测某个对象的属性,发生变化时回直接回调给block
    [RACObserve(myLabel, text) subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    // RAC:把一个对象的某个属性绑定一个信号,只要发出信号,就会把信号的内容给对象的属性赋值
    // 给label的text属性绑定了文本框改变的信号
    UITextField *textfield;
    RAC(myLabel, text) = textfield.rac_textSignal;
    [textfield.rac_textSignal subscribeNext:^(id x) {
        myLabel.text = x;
    }];

 

记录一下RAC的使用

标签:odata   方便   uil   path   class   反向传值   gray   中文   not   

原文地址:https://www.cnblogs.com/110-913-1025/p/11102388.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!