用map还是flattenMap

新手上路,请多包涵

新学习ReactiveCocoa,在困惑什么时候该用map:,什么时候该用flattenMap:。网上很多地方说如果是那种包含流的流stream-of-streams)时,就要用flattenMap。我这边有段代码:

- (RACSignal *)signInSignal {
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [self.signInService signInWithUsername:self.usernameTextField.text
                                      password:self.passwordTextField.text
                                      complete:^(BOOL success) {
                                          [subscriber sendNext:@(success)];
                                          [subscriber sendCompleted];
                                      }];
        return nil;
    }];
}

解释说这个方法会返回一个包含流的流stream-of-streams),各位大牛能够解释下为什么吗?谢谢!

阅读 5.9k
1 个回答
新手上路,请多包涵

最近我也在学习RAC,不知道你的疑问解决了么?我的理解是这样的,RACSignal作为RACStream的子类,本身就具有流的概念,map和flattenMap的区别大概是:map只能一一对应的转换,就是一个源信号只能转换成一个新的信号输出,但是flattenMap是可以转换成一个流,就是需要根据这个源信号发出一系列的信号,实际上map的实现就是使用flattenMap生成仅含有一个信号(这个信号值就是map参数block的返回值)的流。也就是说,map是flattenMap在流中信号数量为1,而且信号值是block的返回值的特殊情况

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进