RAC中的RACLifting

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

    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;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • RAC使用测试Demo下载:github.com/FuWees/WPRACTestDemo 1.ReactiveC...
    FuWees阅读 6,658评论 3 10
  • 文/桃小妖 都说夜深人静时是适合思考的 可我却用它来想念 想念过去 想念现在 想念未来 想念我喜欢的一切 直到今天...
    桃小妖阅读 525评论 0 0
  • 有钱没钱,回家过年。 明天是除夕,相信很多兄弟姐妹都已经在回家的路上了。手边没电脑,身边没软件,这时推出任何教程都...
    小亮老师1980阅读 407评论 0 0
  • 图、文/张晓静 我怎么如此幸运,2015年9月参加武立舅舅九大密码培训班时,孙朝辉弟弟送了我一个小速写本,让我萌生...
    零源宇宙阅读 598评论 0 4
  • 来到候机楼,我们首先要先办理乘机手续,俗话说登机牌的地方,其实这里是值机柜台。不要在说换登机牌的地方了,...
    SummerHa未至阅读 262评论 0 0

友情链接更多精彩内容