RAC中常见的高级用法-过滤

filter
     过滤信号,使用它可以获取满足条件的信号.
- (void)filter
{
    //只有当我们文本框内容长度大于5才想要获取文本框的内容
    [[_passWord.rac_textSignal filter:^BOOL(id value) {
        //value:源信号的内容
        return [value length] > 5;
        //返回值就是过滤的条件,只有满足这个条件才能获取到内容
    }] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
}
 
ignore:
      忽略完某些值的信号.
- (void)ignore
{
    //创建信号
    RACSubject *subject = [RACSubject subject];
    //ignore:忽略一些值
    //ignoreValues:忽略所有值
    RACSignal *ignoreSignal = [subject ignore:@"HMJ"];
//    RACSignal *ignoreSignal = [subject ignoreValues];
    //订阅信号
    [ignoreSignal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    //发送信号
    [subject sendNext:@"HMJ"];
    [subject sendNext:@"WGQ"];
}
 
 
distinctUntilChanged:
     当上一次的值和当前的值有明显的变化就会发出信号,否则会被忽略掉。
     在开发中,刷新UI经常使用,只有两次数据不一样才需要刷新
- (void)distinctUntilChanged
{
    //distinctUntilChanged:如果当前的值跟上一个值相同就不会被调用到
    //创建信号
    RACSubject *subject = [RACSubject subject];
    [[subject distinctUntilChanged] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    [subject sendNext:@"HMJ"];
    [subject sendNext:@"HMJ"];
    [subject sendNext:@"HMJ"];
}
 
take:
     从开始一共取N次的信号
- (void)take
{
    //创建信号
    RACSubject *subject = [RACSubject subject];
    RACSubject *signal = [RACSubject subject];
    //take:取前面几个值
    //在没到第三个时就遇到[subject sendCompleted];那么就会停止发送信号
    [[subject take:3] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    //takeLast:取后面多少个值,必须发送完成
    //只有[subject sendCompleted];才会发送信号
    [[subject takeLast:2] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    //takeUntil:只要传入的信号发送完成或者signal发送信号,就不会再接收信号的内容
    [[subject takeUntil:signal] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    //发送任意数据
    [subject sendNext:@1];
    [subject sendNext:@"HMJ"];
    [subject sendNext:@3];
    [subject sendCompleted];
    [subject sendNext:@4];
    [signal sendNext:@"signal"];
}
 
switchToLatest:
     用于signalOfSignals(信号的信号),有时候信号也会发出信号,会在signalOfSignals中,获取signalOfSignals发送的最新信号
- (void)switchToLatest
{
    RACSubject *signalOfSignal = [RACSubject subject];
    RACSubject *signal = [RACSubject subject];
    // 获取信号中信号最近发出信号,订阅最近发出的信号。
    // 注意switchToLatest:只能用于信号中的信号
    //订阅信号
    [signalOfSignal.switchToLatest subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    //发送信号
    [signalOfSignal sendNext:signal];
    [signal sendNext:@"signal"];
}
 
skip
跳过几个信号,不接受
- (void)skip
{
    //skip:跳跃几个值再接收被订阅
    //创建信号
    RACSubject *subject = [RACSubject subject];
    [[subject skip:2] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    [subject sendNext:@"HMJ"];
    [subject sendNext:@"1"];
    [subject sendNext:@"3"];
}

posted on 2015-11-07 00:02  MJ_Angel  阅读(4557)  评论(0编辑  收藏  举报

导航