ReactiveObjC优化登录功能
目的:优化登录功能简化逻辑代码,利用信号量订阅的方式,实现根据多个输入框的位数限制登录按钮的可点击状态,并限制按钮可能出现的连续点击的情况
1.创建按钮是否可用的信号量(enableSignal),合并用户名输入框信号量(self.phoneText.rac_textSignal)和密码输入框信号量(self.pwdTextView.rac_textSignal),利用返回的(RACTuple)元组判断按钮的可用性
__weak typeof(self) weakSelf = self;
RACSignal *enableSignal = [[RACSignal combineLatest:@[self.phoneText.rac_textSignal,self.pwdTextView.rac_textSignal]] map:^id _Nullable(RACTuple * _Nullable value) {
return @([value[0] length] >= 11 && [value[1] length] >= 8);
}];
2.创建命令,传入enableSignal,在点击的回调中,为订阅者发送数据,并用GCD延时一秒发送完成指令.
self.loginBtn.rac_command = [[RACCommand alloc] initWithEnabled:enableSignal signalBlock:^RACSignal * _Nonnull(id _Nullable input) {
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:nil];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[subscriber sendCompleted];
});
return [RACDisposable disposableWithBlock:^{
}];
}];
}];
3.订阅信号,利用按钮命令获取信号集合(executionSignals),对信号进行订阅,调用登录接口
[self.loginBtn.rac_command.executionSignals subscribeNext:^(RACSignal<id> * _Nullable x) {
[x subscribeNext:^(id _Nullable x) {
[weakSelf login];
}];
}];
4.监听订阅情况
[self.loginBtn.rac_command.executing subscribeNext:^(NSNumber * _Nullable x) {
if([x boolValue]){
NSLog(@"登录");
}else{
NSLog(@"结束");
}
}];