RAC基本使用

@interface ViewController ()

@property (weak, nonatomic) IBOutlet lwRedView *redView;
@property (weak, nonatomic) IBOutlet UIButton *lwbtn;

@property (weak, nonatomic) IBOutlet UITextField *phoneTF;
@property (weak, nonatomic) IBOutlet UITextField *pwTF;
@property (weak, nonatomic) IBOutlet UIButton *loginBtn;

@property (nonatomic, strong) RACCommand * loginCommand;

@end

@implementation ViewController

- (void)tryUseRACMethod
{
    // map 可以转换 信号 (文本输入的字符串 转化为 是否长度为3的bool值)
    // 验证输入框的合法性
    RACSignal *phoneValidSignal = [self.phoneTF.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
        return @((value.length == 3));
    }];
    RACSignal *pwValidSignal = [self.pwTF.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
        return @(value.length>1&&value.length <= 6);
    }];
    
    // 根据监听输入框的内容,是否合法,来改变输入框的背景色
    [[phoneValidSignal map:^id _Nullable(id  _Nullable value) {
        return [value boolValue] ? UIColor.clearColor : UIColor.yellowColor;
    }] subscribeNext:^(id  _Nullable x) {
        self.phoneTF.backgroundColor = x;
    }];
    
//    RAC(_phoneTF,backgroundColor) = [phoneValidSignal map:^id _Nullable(id  _Nullable value) {
//        return value ? UIColor.clearColor : UIColor.yellowColor;
//    }];
    RAC(_pwTF,backgroundColor) = [pwValidSignal map:^id _Nullable(id  _Nullable value) {
        return [value boolValue] ? UIColor.clearColor : UIColor.yellowColor;
    }];
    
    // 合并信号(手机号,密码输入框),创建一个新的关于按钮状态的信号,改变按钮的状态
    RACSignal *activeBtnSignal = [RACSignal combineLatest:@[phoneValidSignal,pwValidSignal] reduce:^id _Nullable(NSNumber *ph,NSNumber *pw){
        return @([ph boolValue] && [pw boolValue]);
    }];
    // 把按钮 和信号绑定
    [activeBtnSignal subscribeNext:^(id  _Nullable x) {
        self.loginBtn.backgroundColor = [x boolValue] ? UIColor.redColor : UIColor.grayColor;
    }];
    
    /// 创建一个登陆请求的信号
    RACSignal *loginSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [self loginRequestWithPhone:self.phoneTF.text pw:self.pwTF.text callBlock:^(BOOL res) {
            [subscriber sendNext:@(res)];
            [subscriber sendCompleted];
        }];
        return nil;
    }];
    
    [[[[self.loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside]
      doNext:^(id  _Nullable x) {
          // 边际效应 不改变信号本身
          self.loginBtn.enabled = NO;
      }]
      // flattenMap 返回信号内容
      flattenMap:^__kindof RACSignal * _Nullable(__kindof UIControl * _Nullable value) {
          return loginSignal;
      }]
     subscribeNext:^(id  _Nullable x) {
         NSLog(@"----------%@",x);
         self.loginBtn.enabled = YES;
     }];
    
    
    [self.loginCommand.executionSignals.switchToLatest subscribeNext:^(id  _Nullable x) {
        NSLog(@"--------logincommand:%@",x);
    }];
    
    [[self.loginCommand executionSignals] subscribeNext:^(id  _Nullable x) {
        NSLog(@"--------1:%@",x);
        // 开始网络请求的信号
        self.view.backgroundColor = [UIColor redColor];
        [x subscribeNext:^(id  _Nullable x) {
            // 网络请求的回调信号
            NSLog(@"--------2:%@",x);
            self.view.backgroundColor = [UIColor whiteColor];
        }];
    }];
    
    [[self.loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside]
     subscribeNext:^(__kindof UIControl * _Nullable x) {
         // 开始执行command
         [self.loginCommand execute:nil];
     }];
}

// 模拟网络请求
- (void)loginRequestWithPhone:(NSString *)phone pw:(NSString *)pw callBlock:(callBlock)callBlock
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        if ([phone isEqualToString:@"120"] && [pw isEqualToString:@"123"]) {
            if(callBlock) callBlock(YES);
        }else{
            if(callBlock) callBlock(NO);
        }
    });
}

- (RACCommand*)loginCommand
{
    if (!_loginCommand) {
        
        _loginCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
            return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
                NSString *phone = @"120";
                NSString *pw = @"123";
                /// 网络请求
                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                    if ([phone isEqualToString:@"120"] && [pw isEqualToString:@"123"]) {
                        [subscriber sendNext:@(1)];
                    }else{
                        [subscriber sendNext:@(0)];
                    }
                    [subscriber sendCompleted];
                });
                return nil;
            }];
        }];
    }
    return _loginCommand;
}

- (void)testRACMethod
{
    /** 监听方法 */
    [[self.redView rac_signalForSelector:@selector(clickBtn:)] subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"========%@",x);
    }];
    
    /// 事件的响应
    [[self.lwbtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"------%@",x);
    }];
    
    /** 监听 kvo */
    [[self.redView rac_valuesForKeyPath:@"frame" observer:nil] subscribeNext:^(id  x) {
        NSLog(@"---------%@",x);
    }];
    // 宏定义的KVO
    [RACObserve(self.redView, frame) subscribeNext:^(id  _Nullable x) {
         NSLog(@"---------%@",x);
    }];
    
    /** 监听 通知 */
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"rac_noti_key" object:nil] subscribeNext:^(NSNotification * _Nullable x) {
        NSLog(@"-------------%@",x);
    }];
    
    // 监听输入框
    [self.wltf.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"------tf:%@",x);
    }];
    
    // 为输入框添加 filter 过滤器
    [[self.wltf.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
        return value.length < 4;
    }] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"-------filter_text:%@",x);
    }];
    
    [[[self.wltf.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
        // 转换信号流为 字符串长度信号流
        return @(value.length);
    }] filter:^BOOL(NSNumber*  _Nullable value) {
        return [value integerValue] > 3;
    }] subscribeNext:^(id  _Nullable x) {
        NSLog(@"==============%ld",[x integerValue]);
    }];
    
    /// 手势的使用
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
    [tap.rac_gestureSignal subscribeNext:^(__kindof UIGestureRecognizer * _Nullable x) {
        NSLog(@"-------%@",x);
    }];
    [self.view addGestureRecognizer:tap];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self tryUseRACMethod];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    _redView.frame = CGRectMake(10, 10, 300, 300);
}

@end

 

上一篇:c# – 使用IL中的Initobj操作码初始化可空类型


下一篇:c# – 是否可以强制类型参数在类上可为空