2018-05-30

//
//  ViewController.m
//  test
//
//  Created by xKing on 2018/5/17.
//  Copyright © 2018年 瞿源鹏. All rights reserved.
//

#import "ViewController.h"
#import "GloabHeader.h"
#import "RACReturnSignal.h"
#import "Person.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *t1;
@property (weak, nonatomic) IBOutlet UITextField *t2;

@property (weak, nonatomic) IBOutlet UIButton *btn;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
   
    [self distinctUntilChanged1];
    
    
    
    
}
// 测试一个需求,不成立
- (void)distinctUntilChanged1{
    // distinctUntilChanged :如果当前的值和上一个值相同,就不会被订阅到
    // 使用场景多用于更新UI上面
    RACSubject *subject = [RACSubject subject];
    [[subject distinctUntilChanged] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    Person *p = [[Person alloc]init];
    p.name = @"1";
    [subject sendNext:p];
    p.name = @"123";
    p.name2 = @"p";
    [subject sendNext:p];
    [subject sendNext:@"2"];
}
- (void)skip{
    // 跳跃几个值
    RACSubject *subject = [RACSubject subject];
    [[subject skip:2] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    [subject sendNext:@"3"];
    [subject sendNext:@"4"];
}
- (void)distinctUntilChanged{
    // distinctUntilChanged :如果当前的值和上一个值相同,就不会被订阅到
    // 使用场景多用于更新UI上面
    RACSubject *subject = [RACSubject subject];
    [[subject distinctUntilChanged] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    [subject sendNext:@"2"];
}

- (void)take{
    // take 只能获取前几个信号
    //    RACSubject *subject = [RACSubject subject];
    //
    //    [[subject take:2] subscribeNext:^(id  _Nullable x) {
    //        NSLog(@"%@",x);
    //    }];
    //
    //    [subject sendNext:@"1"];
    //    [subject sendNext:@"1"];
    //    [subject sendNext:@"1"];
    //    [subject sendNext:@"1"];
    
    // takeLast :取后面多少个值,必须要发送完成
    
        RACSubject *subject = [RACSubject subject];
    
        [[subject takeLast:2] subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
    
        [subject sendNext:@"1"];
        [subject sendNext:@"1"];
        [subject sendNext:@"1"];
        [subject sendNext:@"1"];
        [subject sendCompleted];
    
    // takeUntil :只要传入信号发送完成/或者发送任意数据,就不会再接受源信号的内容
//    RACSubject *subject = [RACSubject subject];
//
//    RACSubject *subject1 = [RACSubject subject];
//
//    [[subject takeUntil:subject1] subscribeNext:^(id  _Nullable x) {
//        NSLog(@"%@",x);
//    }];
//
//    [subject sendNext:@"1"];
//    [subject sendNext:@"1"];
//    [subject sendNext:@"1"];
//    [subject1 sendNext:@"2"];
//    //    [subject1 sendCompleted];
//    [subject sendNext:@"1"];
}

- (void)ignore{
    // 1.ignore:忽略一些值
    RACSubject *subject = [RACSubject subject];
    
    // 2.忽略一些 ignoreValues 忽略所有的值
    RACSignal *ignoreSignal = [subject ignore:@"1"];
    
    // 3. 订阅
    [ignoreSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    // 4. 发送信号
    [subject sendNext:@"13"];
}

- (void)filter{
    // 只有当文本框的长度大于5,猜想获取文本框的内容
    [[_t1.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
        // value 源信号的内容
        // 只有满足条件,才能获取到内容
        return [value length] > 5;
    }] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"%@",x);
    }];
}

// 必须登录界面两个文本框同时满足才可以
- (void)combineLatest{
    //    [_t1.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
    //
    //    }];
    //    [_t2.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
    //
    //    }];
    
    // 组合
    // p1 组合哪些信号
    // reduce 聚合
    // reduceBlock的参数和组合的信号有关-- 对应

    RACSignal *comineSignal = [RACSignal combineLatest:@[_t1.rac_textSignal,_t2.rac_textSignal] reduce:^id(NSString *t1,NSString *t2){
        // block: 只要原信号发送内容就会调用,组合成一个值
        NSLog(@"%@,%@",t1,t2);
        // 聚合的值就是组合信号内容
        return @(t1.length && t2.length);
    }];
    // 订阅组合信号
    //    [comineSignal subscribeNext:^(id  _Nullable x) {
    //        NSLog(@"%@",x);
    //        self->_btn.enabled = [x boolValue];
    //    }];
    RAC(_btn,enabled) = comineSignal;
    
}
// 夫妻关系(只能两个信号)
- (void)zipWith{
    
    // zipWith
    RACSubject *subjectA = [RACSubject subject];
    RACSubject *subjectB = [RACSubject subject];
    
    // 压缩成一个信号
    // 当一个界面多个请求的时候,要等所有的请求完成,才能更新UI
    // zipWith 等所有信号都发送内容的时候才会调用
    RACSignal *zipsignal = [subjectA zipWith:subjectB];
    // 订阅信号
    [zipsignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);// 顺序和发送的前后没有关系,只和组合有关系[subjectA zipWith:subjectB];
    }];
    // 发送信号
    [subjectB sendNext:@"1"];
    [subjectA sendNext:@"2"];
}
- (void)merge{
    // 创建信号A
    RACSubject *signalA = [RACSubject subject];
    // 创建信号B
    RACSubject *signalB = [RACSubject subject];
    
    // 组合信号
    RACSignal *mergeSignal = [signalA merge:signalB];
    
    [mergeSignal subscribeNext:^(id  _Nullable x) {
        // 任意一个信号发送内容,都会来这
        NSLog(@"%@",x);
    }];
    
    // 发送数据
    [signalA sendNext:@"上部分"];
    [signalB sendNext:@"下部分"];
}
// 可以多个一起哦!!!
- (void)thenSignal{
    // 创建信号A
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
        
        // 发送请求
        NSLog(@"发送请求");
        
        [subscriber sendNext:@"上部请求数据"];
        // 只有这里发送完成,才会发送下部分
        [subscriber sendCompleted];
        
        return nil;
    }];
    
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
        
        // 发送请求
        NSLog(@"发送请求");
        
        [subscriber sendNext:@"下部请求数据"];
        
        return nil;
    }];
    
    // thenSignal 会忽略掉第一个信号值
    RACSignal *thenSignal = [signalA then:^RACSignal * _Nonnull{
        // 返回的信号就是需要组合的信号
        return signalB;
        
    }];
    // 订阅信号
    [thenSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
}
// 比如皇上和太子关系
- (void)concat1{
    // 创建信号A
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
        
        // 发送请求
        NSLog(@"发送请求");
        
        [subscriber sendNext:@"上部请求数据"];
        // 只有这里发送完成,才会发送下部分
        [subscriber sendCompleted];
        
        return nil;
    }];
    
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
        
        // 发送请求
        NSLog(@"发送请求");
        
        [subscriber sendNext:@"下部请求数据"];
        
        return nil;
    }];
    
    // concat 按顺序去连接
    // concat: 第一个信号必须调用sendCompleted
    // 创建组合信号
    RACSignal *concatSignal = [signalA concat:signalB];
    
    [concatSignal subscribeNext:^(id  _Nullable x) {
        // 既能拿到A信号的值,又能拿到B信号的值
        NSLog(@"%@",x);
    }];
    
}
- (void)map{
    // 创建信号
    RACSubject *subject = [RACSubject subject];
    
    // 绑定信号
    RACSignal *bindSignal = [subject map:^id _Nullable(id  _Nullable value) {
        // 返回的类型,就是你需要映射的值
        return [NSString stringWithFormat:@"qyp%@",value];
    }];
    
    // 订阅信号
    [bindSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    [subject sendNext:@"123"];
}
- (void)flattenMapyunyong{
    // flattenMap 用于信号中的信号
    RACSubject *signalOfSignal= [RACSubject subject];
    
    RACSubject *signal = [RACSubject subject];
    
    // 订阅信号
    //    [signalOfSignal subscribeNext:^(id  _Nullable x) {
    //        [x subscribeNext:^(id  _Nullable x) {
    //            NSLog(@"%@",x);
    //        }];
    //    }];
    [[signalOfSignal flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value) {
        return value;//value就是signal
    }] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }] ;
    
    
    
    // 发送信号
    [signalOfSignal sendNext:signal];
    [signal sendNext:@"1"];
}
- (void)flattenMap{
    
    // 创建信号
    RACSubject *subject = [RACSubject subject];
    
    // 映射/绑定信号
    RACSignal *bindSignal = [subject flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value) {
        // block:只要源信号发送内容,就会调用.
        // value:就是原信号发送内容
        value = [NSString stringWithFormat:@"qyp%@",value];
        
        // 返回的信号,就是要包装的值
        return [RACReturnSignal return:value];
    }];
    
    // 订阅信号
    [bindSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    [subject sendNext:@"123"];
    
    
    
}


- (void)bind{
    // 1. 创建信号
    RACSubject *subject = [RACSubject subject];
    // 2. 绑定信号
    RACSignal *bindSignal = [subject bind:^RACSignalBindBlock _Nonnull{
        return ^RACSignal *(id value,BOOL *stop){
            // block调用:只要原信号发送数据,就会调用block
            // block作用:处理原信号内容
            // value:源信号发送的内容
            NSLog(@"接收到原信号的内容:%@",value);
            // 处理信号,将原信号进行拦截处理
            value = [NSString stringWithFormat:@"QYP:%@",value];
            // 返回信号,不能传nil,返回空信号[RACSignal empty]
            return [RACReturnSignal return:value];
        };
    }];
    
    // 3. 订阅绑定信号
    [bindSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"接收到的处理过的信号:%@",x);
    }];
    // 4 .发送数据
    [subject sendNext:@"1234"];
}
@end

你可能感兴趣的:(2018-05-30)