RAC中的RACLifting

作者: 一只二进制编码的狗 | 来源:发表于2016-12-02 15:13 被阅读0次

    一开始不太知道这个方法,后来看别人在用就看了下源码,其实也很简单,用了会比较方便,不用也可以用别的形式代替。先看看用法吧。

        RACSignal *signald = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:RACTuplePack(@"haha")];
            return [RACDisposable disposableWithBlock:^{
                NSLog(@"disposable");
            }];
        }];
        
        [[self rac_liftSelector:@selector(testVoid:) withSignalOfArguments:signald] subscribeNext:^(id x) {
            NSLog(@"%@", x);
        }];
    

    其实就是signal的sendNext的值做为方法的入参,有个注意的地方就是sendNext的必需是个RACTuple,所以要包下。方法的返回值会再被sendNext,看看源码,很简单。

    - (RACSignal *)rac_liftSelector:(SEL)selector withSignalOfArguments:(RACSignal *)arguments {
        NSCParameterAssert(selector != NULL);
        NSCParameterAssert(arguments != nil);
        
        @unsafeify(self);
        
        NSMethodSignature *methodSignature = [self methodSignatureForSelector:selector];
        NSCAssert(methodSignature != nil, @"%@ does not respond to %@", self, NSStringFromSelector(selector));
        //会订阅这个信号,拿到返回值然后执行这个方法,然后把得到的返回值返回回去
        return [[[[arguments
            takeUntil:self.rac_willDeallocSignal]
            map:^(RACTuple *arguments) {
                @strongify(self);
                
                NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
                invocation.selector = selector;
                invocation.rac_argumentsTuple = arguments;
                [invocation invokeWithTarget:self];
                
                return invocation.rac_returnValue;
            }]
            replayLast]
            setNameWithFormat:@"%@ -rac_liftSelector: %s withSignalsOfArguments: %@", self.rac_description, sel_getName(selector), arguments];
    }
    

    还有一些的方法,用法一样

    /// Like -rac_liftSelector:withSignals:, but accepts an array instead of
    /// a variadic list of arguments.
    - (RACSignal *)rac_liftSelector:(SEL)selector withSignalsFromArray:(NSArray *)signals;
    
    /// Like -rac_liftSelector:withSignals:, but accepts a signal sending tuples of
    /// arguments instead of a variadic list of arguments.
    - (RACSignal *)rac_liftSelector:(SEL)selector withSignalOfArguments:(RACSignal *)arguments;
    

    相关文章

      网友评论

        本文标题:RAC中的RACLifting

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