ios – 使用ReactiveCocoa时未调用错误块

前端之家收集整理的这篇文章主要介绍了ios – 使用ReactiveCocoa时未调用错误块前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
出于某种原因,我没有收到错误消息. (我在这里简化了代码以直截了当.)
  1. // Send an error message
  2. _loginButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
  3. return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
  4. [subscriber sendError:error]; // Pretend this is a real error
  5. return nil;
  6. }];
  7. }];
  8.  
  9. // Subscribe to loginButton's returned signal
  10. [_loginButton.rac_command.executionSignals subscribeNext:^(RACSignal *loginSignal) {
  11. [loginSignal subscribeError:^(NSError *error) {
  12. NSLog(@"A");
  13. } completed:^{
  14. NSLog(@"B");
  15. }];
  16. }];

这打印“B”.知道为什么吗?如果在订阅者上调用-sendError:,为什么完成块会收到它?

解决方法

正如您所发现的,RACCommand会自动捕获executionSignals中的错误.

这对于像-flatten,-concat和-switchToLatest这样的运算符来说是方便的,否则如果在任何内部信号上发生错误,它将过早地终止.

如果您只关心何时发生错误,则应使用RACCommand.errors.如果您想知道错误发生的位置,那么检查错误域和代码可能比订阅每个内部信号的错误事件更容易(或至少更直观).

订阅订阅内,甚至subscriptions in general,都是RAC中的代码味道.即使您不想使用错误,通常也有更高级别的操作符来完成您想要的操作(例如使用-map:将-catch:应用于每个内部信号).

猜你在找的iOS相关文章