iOS开发ReactiveCocoa学习笔记(六)

RAC操作方法三.

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

  • doNext
  • deliverOn
  • timeout
  • interval
  • delay
  • retry
  • replay
  • throttle

//ReactiveCocoa操作方法之秩序。

- (void)doNext {

    //doNext: 执行Next之前,会先执行这个Block
    //doCompleted: 执行sendCompleted之前,会先执行这个Block
    [[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@1];
        [subscriber sendCompleted];
        return nil;
    }] doNext:^(id x) {
        // 执行[subscriber sendNext:@1];之前会调用这个Block
        NSLog(@"doNext");
    }] doCompleted:^{
        // 执行[subscriber sendCompleted];之前会调用这个Block
        NSLog(@"doCompleted");
    }] subscribeNext:^(id x) {
        NSLog(@"%@",x);

    }];
}

//ReactiveCocoa操作方法之线程。

- (void)deliverOn {
    //deliverOn: 内容传递切换到制定线程中,副作用在原来线程中,把在创建信号时block中的代码称之为副作用。
    
    //subscribeOn: 内容传递和副作用都会切换到制定线程中。
}

//ReactiveCocoa操作方法之时间。

- (void)timeout {
    //timeout:超时,可以让一个信号在一定的时间后,自动报错。
    RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        return nil;
    }] timeout:1 onScheduler:[RACScheduler currentScheduler]];
    
    [signal subscribeNext:^(id x) {
        
        NSLog(@"%@",x);

    } error:^(NSError *error) {
        // 1秒后会自动调用
        NSLog(@"%@",error);
    }];
}

//interval 定时:每隔一段时间发出信号

- (void)interval {

    [[RACSignal interval:1 onScheduler:[RACScheduler currentScheduler]] subscribeNext:^(id x) {
        NSLog(@"%@",x);
    } error:^(NSError *error) {
         NSLog(@"%@",error);
    }];
}

//delay 延迟发送next

- (void)delay {

   [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      
        [subscriber sendNext:@1];
        return nil;
    }] delay:2] subscribeNext:^(id x) {
         NSLog(@"%@",x);
    }];
}

// ReactiveCocoa操作方法之重复。

- (void)retry {
    //retry重试 :只要失败,就会重新执行创建信号中的block,直到成功.
    __block int i = 0;
    [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        
        if (i == 10) {
            [subscriber sendNext:@1];
        }else{
            NSLog(@"接收到错误");
            [subscriber sendError:nil];
        }
        i++;
        return nil;
        
    }] retry] subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
        
    } error:^(NSError *error) {
        
        
    }];
}

//replay重放:当一个信号被多次订阅,反复播放内容

- (void)replay {
    RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        
        
        [subscriber sendNext:@1];
        [subscriber sendNext:@2];
        
        return nil;
    }] replay];
    
    [signal subscribeNext:^(id x) {
        
        NSLog(@"第一个订阅者%@",x);
        
    }];
    
    [signal subscribeNext:^(id x) {
        
        NSLog(@"第二个订阅者%@",x);
        
    }];
}

throttle

- (void)throttle {
    RACSubject *signal = [RACSubject subject];
    _signal = signal;
    // 节流,在一定时间(1秒)内,不接收任何信号内容,过了这个时间(1秒)获取最后发送的信号内容发出。
    [[signal throttle:1] subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
}

学习资料:

最快让你上手ReactiveCocoa之基础篇: http://www.jianshu.com/p/87ef6720a096

最快让你上手ReactiveCocoa之进阶篇: http://www.jianshu.com/p/e10e5ca413b

RAC 基本操作命令 :https://segmentfault.com/a/1190000000408492

MVVM+RAC 从框架到实战: http://www.jianshu.com/p/3beb21d5def2

iOS ReactiveCocoa 最全常用API整理(可做为手册查询: http://www.jianshu.com/p/a4fefb434652

ReactiveCocoa v2.5 源码解析 之 架构总览 : http://www.cocoachina.com/ios/20160105/14880.html

RAC核心元素与信号流:http://www.jianshu.com/p/d262f2c55fbe

posted @ 2017-05-03 21:59  _水畔竹汐  阅读(450)  评论(0编辑  收藏  举报