Map or flattenMap in ReactiveCocoa



我是ReactiveCocoa的新手。我怎么知道什么时候应该使用map:或flatmap: ?我如何知道它是流的还是常规流?这里有一些我看不懂的代码:

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

这个方法返回一个流的流。但是为什么呢?有人能给我解释一下吗?谢谢!

当你想拦截信号发送的值,并且有机会改变该值或发送一个完全不同的值时,使用map操作符。我们可以把它想象成一条生产线,它将部分完成的产品传递下去。生产线上有不同的点,生产线操作员会选择产品,然后把它拧进去或以某种方式改变它。

Flatten map用于当您可能希望将另一个信号注入依赖于初始信号的其他信号时。因此,您可以使用初始信号来影响或确定返回的信号。这是一种方法,你可以把一个或多个信号连接起来,得到一个信号。因此有了这个术语:flatten。您可以在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
})

对于map或flatmap的问题,我想引用下面的评论:https://github.com/ReactiveCocoa/ReactiveCocoa/issues/448 issuecomment - 34977600

最新更新