美文网首页iOS 开发 将来跳槽用iOS Developer
ReactiveCocoa汇总2 常见用法及宏

ReactiveCocoa汇总2 常见用法及宏

作者: 打电话记错号码的人 | 来源:发表于2016-07-29 18:16 被阅读168次

    作品链接:http://www.jianshu.com/users/1e0f5e6f73f6/top_articles

    1.ReactiveCocoa开发中常见用法

    1.1 代替代理:

    • rac_signalForSelector:用于替代代理。
    • rac_signalForSelector:把调用某个对象的方法的信息转换成信号,就要调用这个方法,就会发送信号。
     [[_redView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
            NSLog(@"控制器知道按钮被点击");
        }];
    

    1.2 代替KVO :

    • rac_valuesAndChangesForKeyPath:用于监听某个对象的属性改变。
    • 把监听redV的center属性改变转换成信号,只要值改变就会发送信号
      • 可以监听center、frame、bounds的改变
    [[_redView rac_valuesForKeyPath:@"frame" observer:nil] subscribeNext:^(id x) {
    
            NSLog(@"%@",x);
        }];
    
    
        [[_redView rac_valuesForKeyPath:@"bounds" observer:nil] subscribeNext:^(id x) {
    
            NSLog(@"%@",x);
        }];
    

    1.3 监听事件:

    • rac_signalForControlEvents:用于监听某个事件。
    • 把按钮点击事件转换为信号,点击按钮,就会发送信号
    [[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
    
            NSLog(@"按钮被点击了");
        }];
    

    1.4 代替通知:

    • rac_addObserverForName:用于监听某个通知。
    • 把监听到的通知转换信号
     [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
            NSLog(@"键盘弹出");
        }];
    

    1.5 监听文本框文字改变:

    • rac_textSignal:只要文本框发出改变就会发出这个信号。
      [_textField.rac_textSignal subscribeNext:^(id x) {
    
           NSLog(@"文字改变了%@",x);
       }];
    

    1.6 处理当界面有多次请求时,需要都获取到数据时,才能展示界面

    • rac_liftSelector:withSignalsFromArray:Signals:当传入的Signals(信号数组),每一个signal都至少sendNext过一次,就会去触发第一个selector参数的方法。
    • 使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。
    • 处理多个请求,都返回结果的时候,统一做处理.
     RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    
            // 发送请求1
            [subscriber sendNext:@"发送请求1"];
            return nil;
        }];
    
        RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            // 发送请求2
            [subscriber sendNext:@"发送请求2"];
            return nil;
        }];
    
        // 使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。
        [self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];
    
    
    }
    // 更新UI
    - (void)updateUIWithR1:(id)data r2:(id)data1
    {
        NSLog(@"更新UI%@  %@",data,data1);
    }
    

    2.ReactiveCocoa常见宏

    2.1 RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于给某个对象的某个属性绑定
    • 例如:监听文本框内容

      • 一般用法
            [_textField.rac_textSignal subscribeNext:^(id x) {
    
                _label.text = x;
            }];
    
    
    • 宏用法
     // 用来给某个对象的某个属性绑定信号,只要产生信号内容,就会把内容给属性赋值
        RAC(_label,text) = _textField.rac_textSignal;
    
    2.2 RACObserve(self, name):监听某个对象的某个属性,返回的是信号。
    [RACObserve(self.view, center) subscribeNext:^(id x) {
    
            NSLog(@"%@",x);
        }];
    
    
    
    2.3 @weakify(Obj)和@strongify(Obj),一般两个都是配套使用,解决循环引用问题.
    @weakify(self);
        RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    
            @strongify(self);
            NSLog(@"%@",self);
            return nil;
        }];
        _signal = signal;
    
    2.4 RACTuplePack:把数据包装成RACTuple(元组类)
        // 把参数中的数据包装成元组
        RACTuple *tuple = RACTuplePack(@10,@20);
    

    2.5 RACTupleUnpack:把RACTuple(元组类)解包成对应的数据。

     // 把参数中的数据包装成元组
        RACTuple *tuple = RACTuplePack(@"China",@"beijing");
        // 解包元组,会把元组的值,按顺序给参数里面的变量赋值
        RACTupleUnpack(NSString *contry, NSString *city) = tuple;
        NSLog(@"%@,%@",contry,city);
    

    相关文章

      网友评论

        本文标题: ReactiveCocoa汇总2 常见用法及宏

        本文链接:https://www.haomeiwen.com/subject/sxvzjttx.html