RAC-doNext

之前在看RAC的时候,一直不太明白doNext方法,看官方文档上写的是:

/// Do the given block on `next`. This should be used to inject side effects into
    /// the signal.
    - (RACSignal *)doNext:(void (^)(id x))block;

翻译成汉语就是“在next上执行block。它应该被用来对signal注入副作用”。感觉还是不懂。直到今天,无意当中搜到limboy的博客上面对一段代码的注释:

doNext:^(HBUser *user) {
    // doNext相当于一个钩子,是在sendNext时会被执行的一段代码
                      @ strongify(self);
                      self.user = user;
                  }]

看到这个注释突然好像明白了什么,最近看书也渐渐有看源码的意识了。立马到源码里看了下。

- (RACSignal *)doNext:(void (^)(id x))block {
        NSCParameterAssert(block != NULL);
    
        return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) {
            return [self subscribeNext:^(id x) {
                block(x);
                [subscriber sendNext:x];
            } error:^(NSError *error) {
                [subscriber sendError:error];
            } completed:^{
                [subscriber sendCompleted];
            }];
        }] setNameWithFormat:@"[%@] -doNext:", self.name];
    }

可以只看这一小段代码:

return [self subscribeNext:^(id x) {
                    block(x);
                    [subscriber sendNext:x];
                }

看这里已经很清楚了,doNextblock是在sendNext之前执行的。可以把limboy那段注释改为“doNext相当于一个钩子,是在sendNext之前会被执行的一段代码

Written on February 5, 2015