zoukankan      html  css  js  c++  java
  • iOS开发ReactiveCocoa学习笔记(五)

    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);
        }];
  • 相关阅读:
    SQLite打开提示database disk image is malformed
    windows查看端口占用
    新浪SAE使用Thinkphp框架,禁用memcache节省豆子的方法
    Realtek 8168 安装 VMware ESXi 提示没有驱动
    13年国庆彩蛋
    Flex使用宋体渲染越南语显示错误
    微信 编码要UTF8
    WeiXin 验证成为开发者和更换服务器验证代码
    测试网络连通情况
    废弃sqlite代码,备查
  • 原文地址:https://www.cnblogs.com/ningmengcao-ios/p/6804035.html
Copyright © 2011-2022 走看看