RAC两个方法map和flattenMap区别

作者: 月咏蝴蝶 | 来源:发表于2015-12-20 14:09 被阅读4647次

    flattenMap方法通过调用block(value)来创建一个新的方法,它可以灵活的定义新创建的信号。
    map方法,将会创建一个和原来一模一样的信号,只不过新的信号传递的值变为了block(value)。
    map创建一个新的信号,信号的value是block(value),也就是说,如果block(value)是一个信号,那么就是信号的value仍然是信号。如果是flattenMap则会继续调用这个信号的value,作为新的信号的value。

    - (RACSignal *)signInSignal {
    return [RACSignal createSignal:^RACDisposable *(id subscriber){
       [self.signInService 
         signInWithUsername:self.usernameTextField.text
                   password:self.passwordTextField.text
                   complete:^(BOOL success){
                        [subscriber sendNext:@(success)];
                        [subscriber sendCompleted];
         }];
       return nil;
    }];
    }
    
    [[[self.signInButton
       rac_signalForControlEvents:UIControlEventTouchUpInside]
       map:^id(id x){
         return [self signInSignal];
       }]
       subscribeNext:^(id x){
         NSLog(@"Sign in result: %@", x);
       }];
    

    这里使用map的话,新的信号value是(RACSignal *),我们需要的是这个信号的值,所以这里调用flattenMap,创建新的信号,使用(RACSignal *)的value作为新信号的value,也就是我们需要的值。

    补充:

    map 与 swtichToLatest结合类似于flattenMap
    switchToLatest:选择最新的信号的Block(value),比如我依次发送3个signal,但是switchToLatest只取第三个实现。

    RACCommand两个属性:

    RACCommand的executionSignals属性,是signal of signals,如果直接subscribe的话会得到一个signal,而不是我们想要的value,所以一般会配合switchToLatest

    RACCommand的executing属性,它是一个信号,发送true或false来标明命令开始与结束执行的时间。
    example1:命令执行的时候状态栏网络会显示

    RAC([UIApplication sharedApplication], networkActivityIndicatorVisible) = self.viewModel.executeSearch.executing;
    

    example2:命令执行时,隐藏加载indicator

    RAC(self.loadingIndicator, hidden) = [self.viewModel.executeSearch.executing not];
    
    例子代码来源:

    RAC入门教程第一部分
    RAC入门教程第二部分

    相关文章

      网友评论

      本文标题:RAC两个方法map和flattenMap区别

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