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];
网友评论