Ekta Padaliya
Ekta Padaliya

Reputation: 5799

Using Reactivecocoa Events call only once

I've this simple signal for signing in user.

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

and for my button

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

It works perfectly until I get an error so I change the password text and press the login button but it does nothing it means it calls only once (the sign in button is enabled)

Upvotes: 0

Views: 92

Answers (2)

Ekta Padaliya
Ekta Padaliya

Reputation: 5799

I came up with an answer using 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;

Upvotes: 1

Tony
Tony

Reputation: 542

Try this:

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

Upvotes: 0

Related Questions