【问题标题】:ReactiveCocoa after catch the error, the button signal not get triggered again捕获错误后的ReactiveCocoa,按钮信号不再被触发
【发布时间】:2016-07-21 07:19:35
【问题描述】:

如果我将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];
    }];
}

【问题讨论】:

  • 请检查我的回答。

标签: ios objective-c iphone reactive-cocoa


【解决方案1】:

我认为这个帖子会有所帮助。 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 班级中可能拥有的内容进行猜测。

【讨论】:

    【解决方案2】:

    你可以使用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,根据您的请求发送成功和错误。

    -(RACSignal *)updateImageSignal {
    @weakify(self)
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        @strongify(self)
        [[HttpService sharedService] updateImageData:UIImageJPEGRepresentation(self.signatureImageView.image, 0.5)
                                            complete:^(BOOL success) {
                                                if(success)
                                                    [subscriber sendNext:@(success)];
                                                else
                                                    [subscriber sendError:nil];
                                                [subscriber sendCompleted];
                                            }];
        return nil;
    }];
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多