使用Reactivecocoa事件只调用一次

时间:2016-07-14 12:00:47

标签: ios objective-c reactive-cocoa

这是用于登录用户的简单信号。

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

它完美无缺,直到我收到错误,所以我更改密码文本并按下登录按钮但它什么也没做,这意味着它只调用一次(登录按钮已启用)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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;
    }];
}