我有一个返回信号信号的方法,我必须使用flattenMap
来提取包含在信号中的值。之后我才能使用subscribeNext:complete:获取值。
代码如下所示:
- (RACSignal *)publicSignal {
return [[self privateSignal] map:^id(NSString *code) {
return [self chainingSignalUsingCode:code];
}];
};
[[[obj publicSignal] flattenMap:^id(id value) {
return value;
}] subscribeNext:^(NSString *someValue) {
// extract the value;
} completed:^{
// something to do..
}];
有没有办法消除flattenMap
代码,以便我可以直接订阅publicSignal
?
提前致谢。
答案 0 :(得分:4)
嗯,你可以在flattenMap
...
publicSignal
- (RACSignal *)publicSignal {
return [[[self privateSignal] map:^id(NSString *code) {
return [self chainingSignalUsingCode:code];
}] flattenMap:^(id value) {
return value;
}];
}
[[obj publicSignal] subscribeNext:^(NSString *someValue) {
// extract the value;
} completed:^{
// something to do..
}];
但是为什么我们map
ping,然后立即flattenMap
ping?我们可以说:
- (RACSignal *)publicSignal {
return [[self privateSignal] flattenMap:^(NSString *code) {
return [self chainingSignalUsingCode:code];
}];
}
[[obj publicSignal] subscribeNext: ...
获得相同的效果。
请记住flattenMap
并非真正“提取信号中的值”。它正在从所有信号中提取所有值。当privateSignal
发送新信号时,每个信号发送的每个值接下来publicSignal
- 它基本上会记住所有过去的信号privateSignal
发送和转发他们所有的联系人。如果这是你想要的,那么很棒,它有效。但如果您只想“打开”最新信号,请使用switchToLatest
代替flattenMap
。
如果您不想修改publicSignal
,并且希望它是信号的信号,您可以使用更简单的flatten
方法并订阅:{/ p>
[[[obj publicSignal] flatten] subscribeNext: ...
由于flattenMap
没有做任何事情等同于flatten
(实际上flatten
实现为只返回其值的flattenMap
。或者,如果您只想订阅其发送的最新信号的nexts:
[[[obj publicSignal] switchToLatest] subscribeNext: ...
但只要它是信号的信号,你需要做一些操作来“解开”它。没有帮助器flattenAndThenSubscribe
方法 - 这很好。您可以通过简单基元的组合获得所需的效果。