美文网首页
catch和catchTo

catch和catchTo

作者: 飞羽田海 | 来源:发表于2021-12-06 12:11 被阅读0次
  • catch

Subscribes to the returned signal when an error occurs.
当error发生时,订阅返回信号
可以理解为捕获信号的error信息

   RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"我是发送的信号"];
        [subscriber sendError:[NSError errorWithDomain:@"www.huang"
                                                  code:0
                                              userInfo:@{NSLocalizedDescriptionKey:@"错误信息"}]];
        return nil;
    }];
    RACSignal *newSignal = [signal catch:^RACSignal *(NSError *error) {
        NSLog(@"%@",error.localizedDescription);
        // 注意如果这里使用 [RACSignal return:error] newSignal就不会走error的回调了
        return [RACSignal error:error];
    }];
    
    [newSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
    } error:^(NSError * error) {
        NSLog(@"=%@",error.localizedDescription);
    }];
 ***************
  打印日志:
  我是发送的信号
  错误信息
  =错误信息
  • catchTo

Subscribes to the given signal when an error occurs.

catchTocatch 相同的触发场景,都需要订阅者调用[subscriber sendError]方法时。

    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"我是发送的信号"];
        // error occurs
        [subscriber sendError:[NSError errorWithDomain:@"www.huang"
                                                  code:0
                                              userInfo:@{NSLocalizedDescriptionKey:@"错误信息"}]];
        return nil;
    }];
    
  //  RACSignal *newSignal = [signal catchTo:[RACSignal return:@(1122)]]; // 走next回调
    RACSignal *newSignal = [signal catchTo:[RACSignal error:[NSError errorWithDomain:@"www.huang" code:0 userInfo:@{NSLocalizedDescriptionKey:@"catch的错误信息"}]]]; // 走error回调
    [newSignal subscribeNext:^(id x) {
        NSLog(@"next:%@",x);
    } error:^(NSError *error) {
        NSLog(@"error:%@",error.localizedDescription);
    }];

 ***************
  打印日志:
  next:我是发送的信号
  error:catch的错误信息

需要注意的是,当调用catchTo方法时,是可以拦截next回调或error回调的,取决于被catchTo的信号。

  • 源码
- (RACSignal *)catch:(RACSignal * (^)(NSError *error))catchBlock {
    NSCParameterAssert(catchBlock != NULL);

    return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) {
        RACSerialDisposable *catchDisposable = [[RACSerialDisposable alloc] init];

        RACDisposable *subscriptionDisposable = [self subscribeNext:^(id x) {
            [subscriber sendNext:x]; //不会拦截原来的value; 原来的信号变为热信号,新信号被订阅会来到这里
        } error:^(NSError *error) {
            RACSignal *signal = catchBlock(error); // 外界传入的信号
            NSCAssert(signal != nil, @"Expected non-nil signal from catch block on %@", self);
            catchDisposable.disposable = [signal subscribe:subscriber];
        } completed:^{
            [subscriber sendCompleted];
        }];

        return [RACDisposable disposableWithBlock:^{
            [catchDisposable dispose];
            [subscriptionDisposable dispose];
        }];
    }] setNameWithFormat:@"[%@] -catch:", self.name];
}

- (RACSignal *)catchTo:(RACSignal *)signal {
    return [[self catch:^(NSError *error) {
        return signal; // 传入的信号当做新信号返回,所以订阅新信号的结果决定于传入的信号!
    }] setNameWithFormat:@"[%@] -catchTo: %@", self.name, signal];
}

相关文章

  • catch和catchTo

    catch Subscribes to the returned signal when an error occ...

  • Java的异常处理规则

    catch和finally不能没有try; try和catch之间不能有程序; try一定要有catch或者fin...

  • try块后必须有catch块吗?

    不是必须的。try——catchtry——finallytry——catch——finally但catch和fin...

  • 8/27

    JavaScript 错误 - throw、try 和 catch try 语句测试代码块的错误。catch 语句...

  • try和catch

    http://www.runoob.com/jsref/jsref-try-catch.htmlhttp://ww...

  • try catch捕获异常

    try/catch主要用于捕获异常,try/catch语句包含了yigebtry块,和至少有一个catch块或者饿...

  • C++单元测试框架-Catch

    使用此链接下载最新的弹头文件版本的catch Catch是什么? Catch是一个C++和Objective-C(...

  • promise 练习题(三)

    Promise中的then、catch、finally 需要理解的知识点: 1 .then和.catch都会返回一...

  • TP5中关于try和catch

    注意: 使用try和catch之后,不能在try和catch中使用error或者success,操作成功之后并不会...

  • Kotlin异常处理(2)捕获异常

    try-catch 语句try-catch 表达式多 catch 代码块try-catch 语句嵌套 一、try-...

网友评论

      本文标题:catch和catchTo

      本文链接:https://www.haomeiwen.com/subject/gmsgxrtx.html