首页 > 技术文章 > iOS开发ReactiveCocoa学习笔记(五)

ningmengcao-ios 2017-05-03 21:40 原文

ReactiveCocoa常见操作方法介绍:

demo地址:https://github.com/SummerHH/ReactiveCocoa.git 

  • filter
  • ignore
  • ignoreValues
  • takeUntilBlock
  • distinctUntilChanged
  • take
  • takeLast
  • takeUntil
  • skip
  • switchToLatest

filter: 过滤信号,使用它可以获取满足条件的信号.

//filter 过滤
    //每次信号发出,会先执行过滤条件判断
    [_textField.rac_textSignal filter:^BOOL(NSString *value) {
       
        return value.length > 3;
    }];

ignore:忽略完某些值的信号.

// 内部调用filter过滤,忽略掉ignore的值
    [[_textField.rac_textSignal ignore:@"1"] subscribeNext:^(id x) {
        NSLog(@"ignore%@",x);
    }];

ignoreValues 这个比较极端,忽略所有值,只关心Signal结束,也就是只取ComletionError两个消息,中间所有值都丢弃

 RACSignal *signal=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"1"];
        [subscriber sendNext:@"3"];
        [subscriber sendNext:@"15"];
        [subscriber sendNext:@"wujy"];
        [subscriber sendCompleted];
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"执行清理");
        }];
    }];
    
    
    [[signal ignoreValues] subscribeNext:^(id x) {
        //它是没机会执行  因为ignoreValues已经忽略所有的next值
        NSLog(@"ignoreValues当前值:%@",x);
    } error:^(NSError *error) {
        NSLog(@"ignoreValues error");
    } completed:^{
        NSLog(@"ignoreValues completed");
    }];

distinctUntilChanged:当上一次的值和当前的值有明显的变化就会发出信号,否则会被忽略掉。

 // 过滤,当上一次和当前的值不一样,就会发出内容。
    // 在开发中,刷新UI经常使用,只有两次数据不一样才需要刷新
    
    [[_textField.rac_textSignal distinctUntilChanged] subscribeNext:^(id x) {
        NSLog(@"distinctUntilChanged%@",x);
    }];

take:从开始一共取N次的信号

 //1.创建信号
    RACSubject *signal = [RACSubject subject];
    //2.处理信号,订阅信号
    [[signal take:1] subscribeNext:^(id x) {
        NSLog(@"take:%@",x);

    }];
    
    // 3.发送信号
    [signal sendNext:@1];
    
    [signal sendNext:@2];

takeLast:取最后N次的信号,前提条件,订阅者必须调用完成,因为只有完成,就知道总共有多少信号.

 //1.创建信号
    RACSubject *signal = [RACSubject subject];
    //2.处理信号,订阅信号
    [[signal takeLast:2] subscribeNext:^(id x) {
        NSLog(@"%@",x);

    }];
    
    //3.发送信号
    [signal sendNext:@1];
    [signal sendNext:@332];
    [signal sendNext:@333];
    [signal sendCompleted];

takeUntil:(RACSignal *):获取信号直到执行完这个信号

  // 监听文本框的改变,知道当前对象被销毁
    [_textField.rac_textSignal takeUntil:self.rac_willDeallocSignal];

takeUntilBlock 对于每个next值,运行block,当block返回YES时停止取值

  RACSignal *signal=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"1"];
        [subscriber sendNext:@"3"];
        [subscriber sendNext:@"15"];
        [subscriber sendNext:@"wujy"];
        [subscriber sendCompleted];
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"执行清理");
        }];
    }];
    
    [[signal takeUntilBlock:^BOOL(NSString *x) {
        if ([x isEqualToString:@"15"]) {
            return YES;
        }
        return NO;
    }] subscribeNext:^(id x) {
        NSLog(@"takeUntilBlock 获取的值:%@",x);
    }];
    
    //    输出
    //    takeUntilBlock 获取的值:1
    //    takeUntilBlock 获取的值:3

skip:(NSUInteger):跳过几个信号,不接受。

 [[_textField.rac_textSignal skip:1] subscribeNext:^(id x) {
        NSLog(@"跳过几个信号不接收%@",x);
    }];

switchToLatest:用于signalOfSignals(信号的信号),有时候信号也会发出信号,会在signalOfSignals中,获取signalOfSignals发送的最新信号。

 RACSubject *signalOfSignals = [RACSubject subject];
    RACSubject *signal = [RACSubject subject];
    [signalOfSignals sendNext:signal];
    // 获取信号中信号最近发出信号,订阅最近发出的信号。
    // 注意switchToLatest:只能用于信号中的信号
    
    [signalOfSignals.switchToLatest subscribeNext:^(id x) {
        
        NSLog(@"获取信号中信号最近发出信号,订阅最近发出的信号%@",x);
    }];

 

推荐阅读