使用ReactiveCocoa时如何直接订阅信号信号而不使用flattenMap?

时间:2014-04-11 14:46:31

标签: objective-c reactive-cocoa

我有一个返回信号信号的方法,我必须使用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

提前致谢。

1 个答案:

答案 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方法 - 这很好。您可以通过简单基元的组合获得所需的效果。