RAC两个方法map和flattenMap区别

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区别)