如果我向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];
}];
}
答案 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
希望它会对你有所帮助。如果您有任何疑问,请随时提出。