RAC基本使用
Posted liuwenqiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于RAC基本使用的主要内容,如果未能解决你的问题,请参考以下文章