RAC使用

作者: Vijay_ | 来源:发表于2017-10-30 03:56 被阅读14次

    RAC常用宏

    //kvo监听
    [RACObserve(self.view, center) subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
      // 只要文本框文字改变,就会修改label的文字,将ui属性绑定其他ui信号属性
        RAC(self.labelView,text) = _textField.rac_textSignal;
    // 把参数中的数据包装成元组
        RACTuple *tuple = RACTuplePack(@10,@20);
    //解包
    RACTupleUnpack($param,...) = tuple;
    

    KVO监听使用

    //注意 在block中使用self.时会出现强引用 必须使用@weakify(self)和@strongify(self)来组合
    @weakify(self) //此处创建一个弱引用的self
    [RACObserve($对象,$属性) subscribeNext:^(id x){
    @strongify(self) //此处创建一个强引用的self指向外面的弱引用self
    //当对象的被监听属性发生改变时调用 x为新值
    }
    

    RAC宏使用

    ##当kvo监听的属性发生变化是RAC宏监听的属性也会跟随变化
    RAC($target,$property) = RACObserve($target,$property);
    ##监听多个信号处理后,给RAC监听的属性赋值
    RAC($target,$property) = RAC(self,enabled) = [RACSignal combineLatest:@[RACObserve(self.obj, name)] reduce:^(NSString* name){
            return name;
        }];
    ##单纯绑定信号
     RACSubject *sub = [RACSubject subject];
        RAC(self,enabled) = sub;
        [sub sendNext:@"hello"];
        NSLog(@"%@",self.enabled);
        
        [sub sendNext:@"hello22"];
        NSLog(@"%@",self.enabled);
    ##注意 如果要绑定ui控件的事件返回值的话要使用提供的rac信号事件
    ##,底层是监听事件后发送控件值的Signal对象
    RAC(lable,text) = textfield.rac_textSignal;
    
    

    信号类使用

    //RACSignal信号类使用(先储存发送的信号,然后订阅信号时发送)
    RACSignal* signal = [RACSignal crateSignal:
    ^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull 
    //subscriber是订阅者 必须实现RACSubscriber协议
    subscriber){
    //发送信号
    [subscriber sendNext:@"signal"];
    //信号发送完后最好调用结束方法
    [subscriber sendCompleted];
    //需要返回一个RACDisposable对象
    return [RACDisposable disableWithBlock:^{
    //当信号释放时调用该block
    }];
    }];
    //订阅信号 并接收信号
    [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"收到数据%@",x);
        }];
    
    ##RACSubject信号类使用(先储存订阅函数,然后在发送信号时调用所有订阅函数);
    ##RACReplaySubject信号类使用(先储存发送的信号内容,然后在订阅信号时遍历所有的信号调用函数);
    

    使用信号模拟代理

    //Signal.h
    @property (nonatomic,retain)RACSubject* subject;
    //Signal.m
    - (RACSubject *)subject{
        if (!_subject) {
    //注意 不能使用self.subject 会调用subject方法 造成死循环
            _subject = [RACSubject subject];
            [_subject subscribeNext:^(id  _Nullable x) {
                NSLog(@"%@",x);
            }];
        }
        return _subject;
    }
    //调用
    Signal* si = [[Signal alloc] init];
        [si.subject sendNext:@"hello"];
    

    rac_sequence遍历字典 解包元组

    NSMutableDictionary* dictionary = [NSMutableDictionary dictionary];
        [dictionary setObject:@11 forKey:@"age"];
        [dictionary.rac_sequence.signal subscribeNext:^(RACTuple* x) {
      //解包元组
            RACTupleUnpack(NSString* key,NSNumber* val) = x;
      // 相当于以下写法
    //        NSString *key = x[0];
    //        NSString *value = x[1];
            YPLog(@"%@---%@",key,val);
        }];
    

    事件、指令(rac_command)

    #在有事件的ui控件中会补充一个rac_command属性用作控件的事件指令
    #该属性需要一个绑定了信号的指令对象
    #给指令的信号对象订阅函数 当控件事件触发时会调用指令对象绑定的信号
     btn.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable button) {
            RACReplaySubject* sub =[RACReplaySubject subject];
            [sub sendNext:@"hello"];
            return sub;
        }];
        [btn.rac_command.executionSignals subscribeNext:^(id x) {
            RACReplaySubject* s = x;
            [s subscribeNext:^(id  _Nullable x) {
                NSLog(@"%@",x);
            }];
    

    异步操作

    RACSignal* s1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            [subscriber sendNext:@"1"];
            [subscriber sendCompleted];
            return [RACDisposable disposableWithBlock:^{
                
            }];
        }];
        RACSignal* s2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            [subscriber sendNext:@"2"];
            [subscriber sendCompleted];
            return  [RACDisposable disposableWithBlock:^{
                
            }];
        }];
        [s1 subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        [s2 subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        [[RACSignal merge:@[s1,s2]] subscribeCompleted:^{
            NSLog(@"both down");
        }];
    
    

    链式函数

    # flattenMap相当于给当前信号订阅上函数
    # 然后返回一个新的信号然后可以一直给该信号使用flattenMap链式订阅函数,
    # 每个订阅函数执行完后会自动销毁当前信号 并要求返回一个新的信号
    #then函数功能和flattenMap一样 作为链式调用,但是它的block无法
    #接受上个信号对象发送的信号,并且不会结束信号
    
      RACSignal* s1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            [subscriber sendNext:@"1"];
            [subscriber sendCompleted];
            return [RACDisposable disposableWithBlock:^{
                
            }];
        }];
        RACSignal* s2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            [subscriber sendNext:@"2"];
            [subscriber sendCompleted];
            return  [RACDisposable disposableWithBlock:^{
                
            }];
        }];
        [[[s1 flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value) {
            NSLog(@"---%@",value);
            
            return s2;
        }] flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value) {
            NSLog(@"---%@",value);
            
            return s2;
        }]subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
    

    获取UI控件事件信号进行使用

    [[btn rac_signalForControlEvents:UIControlEventTouchUpInside ] subscribeNext:^(__kindof UIControl * _Nullable x) {
            NSLog(@"%@",x);
        }];
    

    相关文章

      网友评论

          本文标题:RAC使用

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