2016-07-14 41 views
0

我有這個簡單的信號用於登錄用戶。使用Reactivecocoa只能撥打一次電話

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

它完美,所以我改密碼文本,並按下登錄按鈕,但它什麼都不做就意味着它要求只有一次(符號,直到我得到一個錯誤在按鈕被激活)

回答

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; 
+0

RACCommand是一個更優雅的解決方案。 – Catoshi

+0

@TonyHan是的,它真的很有幫助。如果你發現這是有用的,然後PLZ upvote。這是我們的動力。 :d –

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; 
    }]; 
} 
+0

這是RayWenderlich的例子,它工作正常,但我想使用「錯誤」塊。你知道該怎麼辦? –

+0

當您發送錯誤時,RAC將調用'RACDisposable disposableWithBlock'並且信號將被處理。如果您想要重複使用該信號,則不能使用'sendError'。[UIControl + RACSignalSupport](https://github.com/ReactiveCocoa/ ReactiveCocoa/blob/7877f99bdfb4be1c82c4804082e99c35d0a93a91/ReactiveCocoa/Objective-C/UIControl%2BRACSignalSupport.m)和[ - (void)sendError:(NSError *)e](https://github.com/ReactiveCocoa/ReactiveCocoa/blob/7877f99bdfb4be1c82c4804082e99c35d0a93a91/ReactiveCocoa /Objective-C/RACSubscriber.m)。 – Catoshi