使用 Reactivecocoa Events 只调用一次
Using Reactivecocoa Events call only once
我有这个简单的用户登录信号。
-(RACSignal *)signInSignal {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[self.signInService
signInWithUsername:self.usernameTextField.text
password:self.passwordTextField.text
complete:^(BOOL success) {
if(success)
{
[subscriber sendNext:@(success)];
[subscriber sendCompleted];
}
else
[subscriber sendError:nil];
}];
return nil;
}];
}
还有我的按钮
[[[[self.signInButton
rac_signalForControlEvents:UIControlEventTouchUpInside]
doNext:^(id x) {
NSLog(@"In do next");
self.signInButton.enabled = NO;
self.signInFailureText.hidden = YES;
}]
flattenMap:^id(id x) {
NSLog(@"flatten map");
return [self signInSignal];
}]
subscribeNext:^(NSNumber *signedIn) {
NSLog(@"In subscribe");
self.signInButton.enabled = YES;
self.signInFailureText.hidden = 1;
[self performSegueWithIdentifier:@"signInSuccess" sender:self];
} error:^(NSError *error) {
self.signInButton.enabled = YES;
self.signInFailureText.hidden = 0;
}];
在出现错误之前,它一直运行良好,因此我更改了密码文本并按下了登录按钮,但它什么也没做,这意味着它只调用一次(登录按钮已启用)
试试这个:
[[[[self.signInButton
rac_signalForControlEvents:UIControlEventTouchUpInside]
doNext:^(id x){
NSLog(@"In do next");
self.signInButton.enabled = NO;
self.signInFailureText.hidden = YES;
}]
flattenMap:^id(id x){
NSLog(@"flatten map");
return [self signInSignal];
}]
subscribeNext:^(NSNumber*signedIn){
NSLog(@"In subscribe");
self.signInButton.enabled =YES;
BOOL success =[signedIn boolValue];
self.signInFailureText.hidden = success;
if(success){
[self performSegueWithIdentifier:@"signInSuccess" sender:self];
}
}];
- (RACSignal *)signInSignal {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber){
[self.signInService
signInWithUsername:self.usernameTextField.text
password:self.passwordTextField.text
complete:^(BOOL success){
[subscriber sendNext:@(success)];
[subscriber sendCompleted];
}];
return nil;
}];
}
我用 RACCommand
想出了一个答案
RACCommand *submitCommand =
[[RACCommand alloc] initWithEnabled:signUpActiveSignal signalBlock:^RACSignal *(id input) {
return [[[self signInSignal]
doCompleted:^{
self.signInButton.enabled = YES;
self.signInFailureText.hidden = 1;
[self performSegueWithIdentifier:@"signInSuccess" sender:self];
}] doError:^(NSError *error) {
self.signInButton.enabled = YES;
self.signInFailureText.hidden = 0;
}];
}];
self.signInButton.rac_command = submitCommand;
我有这个简单的用户登录信号。
-(RACSignal *)signInSignal {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[self.signInService
signInWithUsername:self.usernameTextField.text
password:self.passwordTextField.text
complete:^(BOOL success) {
if(success)
{
[subscriber sendNext:@(success)];
[subscriber sendCompleted];
}
else
[subscriber sendError:nil];
}];
return nil;
}];
}
还有我的按钮
[[[[self.signInButton
rac_signalForControlEvents:UIControlEventTouchUpInside]
doNext:^(id x) {
NSLog(@"In do next");
self.signInButton.enabled = NO;
self.signInFailureText.hidden = YES;
}]
flattenMap:^id(id x) {
NSLog(@"flatten map");
return [self signInSignal];
}]
subscribeNext:^(NSNumber *signedIn) {
NSLog(@"In subscribe");
self.signInButton.enabled = YES;
self.signInFailureText.hidden = 1;
[self performSegueWithIdentifier:@"signInSuccess" sender:self];
} error:^(NSError *error) {
self.signInButton.enabled = YES;
self.signInFailureText.hidden = 0;
}];
在出现错误之前,它一直运行良好,因此我更改了密码文本并按下了登录按钮,但它什么也没做,这意味着它只调用一次(登录按钮已启用)
试试这个:
[[[[self.signInButton
rac_signalForControlEvents:UIControlEventTouchUpInside]
doNext:^(id x){
NSLog(@"In do next");
self.signInButton.enabled = NO;
self.signInFailureText.hidden = YES;
}]
flattenMap:^id(id x){
NSLog(@"flatten map");
return [self signInSignal];
}]
subscribeNext:^(NSNumber*signedIn){
NSLog(@"In subscribe");
self.signInButton.enabled =YES;
BOOL success =[signedIn boolValue];
self.signInFailureText.hidden = success;
if(success){
[self performSegueWithIdentifier:@"signInSuccess" sender:self];
}
}];
- (RACSignal *)signInSignal {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber){
[self.signInService
signInWithUsername:self.usernameTextField.text
password:self.passwordTextField.text
complete:^(BOOL success){
[subscriber sendNext:@(success)];
[subscriber sendCompleted];
}];
return nil;
}];
}
我用 RACCommand
RACCommand *submitCommand =
[[RACCommand alloc] initWithEnabled:signUpActiveSignal signalBlock:^RACSignal *(id input) {
return [[[self signInSignal]
doCompleted:^{
self.signInButton.enabled = YES;
self.signInFailureText.hidden = 1;
[self performSegueWithIdentifier:@"signInSuccess" sender:self];
}] doError:^(NSError *error) {
self.signInButton.enabled = YES;
self.signInFailureText.hidden = 0;
}];
}];
self.signInButton.rac_command = submitCommand;