我是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