美文网首页
tryMap和try

tryMap和try

作者: 飞羽田海 | 来源:发表于2021-12-03 14:47 被阅读0次
  • tryMap
    RACSignal的一般用法是:
      RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
          [subscriber sendNext:@"我是发送的数据"];
          [subscriber sendError:[NSError errorWithDomain:@"www.huang"
                                                    code:0
                                                userInfo:@{NSLocalizedDescriptionKey:@"错误信息"}]];
          return nil;
      }];
      [signal subscribeNext:^(id x) {
          NSLog(@"next:%@",x);
      } error:^(NSError *error) {
          NSLog(@"error:%@",error.localizedDescription);
      }];
    
     ---------
     打印结果:
      next:我是发送的数据
      error:错误信息
    
    如果想对subscriber发送的数据进行一些处理(比如筛选符合预期的数据走next回调,不符合预期的走error回调),应该怎么操作呢?
      RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
          [subscriber sendNext:@"我是发送的数据"];
          return nil;
      }];
      
      [signal subscribeNext:^(id x) {
          NSLog(@"next:%@",x);
      } error:^(NSError *error) {
          NSLog(@"error:%@",error.localizedDescription);
      }];
    
    此时tryMap就能排上用场了
      RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
          [subscriber sendNext:@"我是发送的数据"];
          return nil;
      }];
      
      RACSignal *newSignal = [signal tryMap:^id(id value, NSError *__autoreleasing *errorPtr) {
          if ([value isKindOfClass:[NSNumber class]]) {
              // 符合预期 返回原本的值
              return value;
          } else {
              // 不符合预期,走error回调
              NSError *error = [NSError errorWithDomain:@"www.huang"
                                                   code:0
                                               userInfo:@{NSLocalizedDescriptionKey:@"数据格式错误"}];
              *errorPtr = error;
              // 这里一定要返回nil,相当于拦截了value的值,就不会走next回调了
              return nil;
          }
      }];
    
      // Note: 其实可以使用 tryMap 原来的value,并返回新的value给 next回调
      
      [newSignal subscribeNext:^(id x) {
          NSLog(@"next:%@",x);
      } error:^(NSError *error) {
          NSLog(@"error:%@",error.localizedDescription);
      }];
    
     ---------
     打印结果:
     error:数据格式错误
    
  • try
    tryMap不同,try需要给定一个布尔值来决定subscriber回调的执行逻辑。
       RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
          [subscriber sendNext:@"我是发送的数据"];
          return nil;
      }];
      
      /**
       返回值是一个BOOL
       当返回YES时,subscriber 订阅时走next回调
       当返回NO时,subscriber 订阅时走error回调
       */
      RACSignal *newSignal = [signal try:^BOOL(id value, NSError *__autoreleasing *errorPtr) {
          NSError *error = [NSError errorWithDomain:@"www.huang"
                                                        code:0
                                                    userInfo:@{NSLocalizedDescriptionKey:@"数据格式错误"}];
          *errorPtr = error;
          return NO;
         
          /**
           这样并不能修改原来发送的value的值,因为这是形参!!
           value = @(1234);
           return YES;
           */
          
      }];
      
      [newSignal subscribeNext:^(id x) {
          NSLog(@"next:%@",x);
      } error:^(NSError *error) {
          NSLog(@"error:%@",error.localizedDescription);
      }];
    
     ---------
     打印结果:
     error:数据格式错误
    
  • 源码
    - (RACSignal *)try:(BOOL (^)(id value, NSError **errorPtr))tryBlock {
      NSCParameterAssert(tryBlock != NULL);
    
      return [[self flattenMap:^(id value) {
          NSError *error = nil;
          BOOL passed = tryBlock(value, &error);
                 // 关键点 passed是否为YES
          return (passed ? [RACSignal return:value] : [RACSignal error:error]);
      }] setNameWithFormat:@"[%@] -try:", self.name];
    }
    
    - (RACSignal *)tryMap:(id (^)(id value, NSError **errorPtr))mapBlock {
      NSCParameterAssert(mapBlock != NULL);
    
      return [[self flattenMap:^(id value) {
          NSError *error = nil;
          id mappedValue = mapBlock(value, &error);
                  // 关键点: mappedValue是否为nil
          return (mappedValue == nil ? [RACSignal error:error] : [RACSignal return:mappedValue]);
      }] setNameWithFormat:@"[%@] -tryMap:", self.name];
    }
    

相关文章

  • tryMap和try

    tryMapRACSignal的一般用法是: RACSignal *signal = [RACSignal cr...

  • Java的异常处理规则

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

  • try to do和try doing傻傻分不清?

    语言知识专题(一) 主讲:Becky Yao Try to do 和 try...

  • try和catch

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

  • try try? try!

    try try? try! 也是好晕 如这样的情况 报错提示 需要加上 try, try是swift 2...

  • try  try  try

    2017年1月9日练了一节艾扬格小班课程,力量和精准练习,让我从胳膊酸到腿,身体累,但心情却很放松,夜里也深沉的睡...

  • try、try?、try!

    try: try与do-catch语句一起使用,并对错误进行详细处理。 try? try?用在错误无关紧要的时候,...

  • 一句话搞清try to do 和try doing的区别

    一句话搞清try to do 和try doing的区别

  • [java基础]try-catch-finally

    1. 原来在销冠的时候只有一处用到try和catch。使用try和catch最大的区别在于,如果不使用try,发生...

  • 8/27

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

网友评论

      本文标题:tryMap和try

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