ReactiveCocoa捕获错误后,按钮信号不再被触发

时间:2016-07-21 07:19:35

标签: ios objective-c iphone reactive-cocoa

如果我向UIControlEventTouchUpInside添加doneButton信号并调用API,则在API失败时,将调用catch。但是,如果我再次尝试单击该按钮,则不会触发按钮控件事件。

- (void)viewDidLoad {
    [super viewDidLoad];

    [[[[[self.doneButton rac_signalForControlEvents:UIControlEventTouchUpInside] doNext:^(id x) {
        [SVProgressHUD show];
    }] flattenMap:^RACStream *(id value) {
        return [[HttpService sharedService] updateImageData:UIImageJPEGRepresentation(self.signatureImageView.image, 0.5)];
    }] catch:^RACSignal *(NSError *error) {
        [SVProgressHUD showErrorWithStatus:error.localizedDescription];
        return [RACSignal empty];
    }] subscribeNext:^(id x) {
        [SVProgressHUD dismiss];
        [self.navigationController popToRootViewControllerAnimated:YES];
    }];
}

2 个答案:

答案 0 :(得分:2)

我认为这个帖子会有所帮助。 https://github.com/ReactiveCocoa/ReactiveCocoa/issues/1218

如果信号失败/错误,信号将自动取消订阅。你可以使用- retry,但这只会继续尝试你的操作,直到没有失败,如果有一个永久的问题将无限循环。

flattenMap中包含此条件将捕获问题而不取消订阅初始rac_signalForControlEvents观察。

在GitHub上面的帖子中查看 mdiep 的评论,也许会做类似的事情。

[[[[self.doneButton rac_signalForControlEvents:UIControlEventTouchUpInside] doNext:^(id x) {
    [SVProgressHUD show];
}] flattenMap:^RACStream *(id value) {
    return [[[HttpService sharedService] updateImageData:UIImageJPEGRepresentation(self.signatureImageView.image, 0.5)] 
      catch:^RACSignal *(NSError *error) {
        [SVProgressHUD showErrorWithStatus:error.localizedDescription];
        return [RACSignal empty];
      }];
}] subscribeNext:^(id x) {
    [SVProgressHUD dismiss];
    [self.navigationController popToRootViewControllerAnimated:YES];
}];

我实际上并没有使用此代码构建测试。只需根据HttpService类中的内容进行猜测。

答案 1 :(得分:0)

您可以使用512来解决此问题。

RACCommand

现在创建RACCommand *doneCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(NSString *selected) { return [[[self updateImageSignal] doCompleted:^{ [SVProgressHUD dismiss]; [self.navigationController popToRootViewControllerAnimated:YES]; }] doError:^(NSError *error) { [SVProgressHUD showErrorWithStatus:error.localizedDescription]; }]; }]; self.doneButton.rac_command = doneCommand; ,根据您的请求发送成功和错误。

RACSignal

希望它会对你有所帮助。如果您有任何疑问,请随时提出。