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入门教程第二部分

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

相关阅读更多精彩内容

友情链接更多精彩内容