在ReactiveCocoa中映射或展平地图

时间:2015-08-02 14:04:29

标签: ios objective-c reactive-cocoa

我是ReactiveCocoa的新手。我怎么知道何时使用map:或flattenMap:?我怎么知道它是 stream-of-streams 还是常规流?在这里,我得到了一些我无法理解的代码:

- (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;
    }];
}

此方法返回流的流。但为什么?有谁可以帮我解释一下?谢谢!

2 个答案:

答案 0 :(得分:3)

当您希望在信号发送值并且有机会更改该值或发送完全不同的值时进行拦截时,请使用map运算符。考虑这一点的一种方法是将生产线部分完成的生产线。生产线上有各种要点,生产线操作员将选择产品并拧入某些东西或以某种方式改变它。

Flatten map适用于您可能希望将另一个信号注入其他依赖于初始信号的信号的情况。因此,您可以使用初始信号来影响或确定返回的信号。这是您可以采用一个或多个信号并以产生一个信号的方式连接它们的方法之一。因此术语:扁平化。您在RAC中执行此操作的其他略有不同的方法是merge:switchToLatest(),仅举几例。成像您有一个基于特定搜索查询进行网络提取的信号。然后想象你有另一个信号输入到搜索框中。为了根据searchText信号中​​的当前搜索查询执行搜索请求,您可以使用展平地图。

self.searchTextSignal.flattenMap({(object: AnyObject!) -> RACSignal! in
    if let searchQuery: String = object as? String {
        return self.networkFetchSignal(query: searchQuery)
    }
    return RACSignal.empty()
}).subscribeNext({(object: AnyObject) -> Void in 
   //the results
})

答案 1 :(得分:1)

对于地图或flattenMap问题,我想引用此评论: https://github.com/ReactiveCocoa/ReactiveCocoa/issues/448#issuecomment-34977600