RAC使用

2017-10-30  本文已影响14人  Vijay_

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);
    }];
上一篇下一篇

猜你喜欢

热点阅读