美文网首页
RAC的map:方法

RAC的map:方法

作者: 高思阳 | 来源:发表于2019-05-17 17:54 被阅读0次
    RACSignal *signal = [self.accountField.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
      RACSignal *newSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [subscriber sendNext:[NSString stringWithFormat:@"map后的字符串+%@",value]];
        return nil;
      }];
      return newSignal;
    }];
    
    [signal subscribeNext:^(id  _Nullable x) {
      //这里的x变量是上面的newSignal
    }];
    

    上面代码相当于:

    id (^firstBlock)(id value) = ^id _Nullable(NSString * _Nullable value) {
        RACSignal *newSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [subscriber sendNext:[NSString stringWithFormat:@"map后的字符串+%@",value]];
        return nil;
      }];
      return newSignal;
    }
    
    RACSignal *signal = [self.accountField.rac_textSignal map:firstBlock]; //map:firstBlock返回的是newSignal
    
    [sig subscribeNext:^(id  _Nullable x) {
      //这里的x变量是上面的newSignal
    }];
    
    //map:方法实现
    - (__kindof RACStream *)map:(id (^)(id value))firstBlock {
        NSCParameterAssert(firstBlock != nil);
    
        Class class = self.class;
        
        return [[self flattenMap:^(id value) {
            return [class return:firstBlock(value)]; //这里返回的是一个RACReturnSignal,里面的value属性保存的是firstBlock(value),也就是newSignal
        }] setNameWithFormat:@"[%@] -map:", self.name];
    }
    
    
    //map:方法改写
    - (__kindof RACStream *)map:(id (^)(id value))firstBlock {
        NSCParameterAssert(firstBlock != nil);
    
        Class class = self.class;
            
            //secondBlock返回的是一个RACReturnSignal对象,里面的value属性保存的是firstBlock(value),firstBlock(value)就是newSignal
            RACStream * (^secondBlock)(id value)) = ^(id value) {
            return [class return:firstBlock(value)]; 
        };
        
        return [[self flattenMap:secondBlock] setNameWithFormat:@"[%@] -map:", self.name];
    }
    
    //flattenMap:方法实现
    - (__kindof RACStream *)flattenMap:(__kindof RACStream * (^)(id value))secondBlock {
        Class class = self.class;
    
        return [[self bind:^{
            return ^(id value, BOOL *stop) {
                id stream = secondBlock(value) ?: [class empty];  //这里secondBlock(value)就是上面说的RACReturnSignal对象,里面的value属性保存的是firstBlock(value),firstBlock(value)就是newSignal
                NSCAssert([stream isKindOfClass:RACStream.class], @"Value returned from -flattenMap: is not a stream: %@", stream);
    
                return stream;
            };
        }] setNameWithFormat:@"[%@] -flattenMap:", self.name];
    }
    
    //flattenMap:方法改写
    - (__kindof RACStream *)flattenMap:(__kindof RACStream * (^)(id value))secondBlock {
        Class class = self.class;
            
            //这里bindingBlock调用后返回的就是stream = secondBlock(value)
        RACSignalBindBlock bindingBlock =  ^RACSignal* (id value, BOOL *stop) {
            id stream = secondBlock(value) ?: [class empty];  //这里secondBlock(value)就是上面说的RACReturnSignal对象,里面的value属性保存的是firstBlock(value),firstBlock(value)就是newSignal
            NSCAssert([stream isKindOfClass:RACStream.class], @"Value returned from -flattenMap: is not a stream: %@", stream);
    
            return stream;
        };
        return [[self bind:bindingBlock] setNameWithFormat:@"[%@] -flattenMap:", self.name];
    }
    

    bind:方法内部:
    RACSignal *signal = createSignal:block
    在block里面做了下面的事情
    调用 id signalA = bindingBlock() //得到的signalA就是上面的stream,也就是secondBlock(value) ,secondBlock(value) 返回的是一个RACReturnSignal对象,里面保存了value = firstBlock(value)
    signalA suscribeNext:blockA //因为signalA是一个RACReturnSignal对象,该对象suscribeNext:内signal的订阅者会调用sendNext:方法将value属性(保存的firstBlock(value),也就是newSignal)当做参数传递
    [sig subscribeNext:^(id _Nullable x) {
    这里收到的就是newSignal
    }];
    return signal

    相关文章

      网友评论

          本文标题:RAC的map:方法

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