使用反应可可事件仅调用一次



我有一个简单的信号来登录用户。

-(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;
 }];

运行良好,直到我收到错误,所以我更改密码文本并按登录按钮,但它什么也不做,这意味着它只调用一次(登录按钮已启用)

我用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;

试试这个:

[[[[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;
    }];
}

相关内容

最新更新