¿Cómo suscribir directamente una señal de señal sin flattenMap cuando se usa ReactiveCocoa?
-
21-12-2019 - |
Pregunta
Tengo un método que devuelve una señal de señal y tengo que usar flattenMap
para extraer el valor envuelto en la señal.Después de eso sólo puedo usar subscribeNext:complete:para obtener el valor.
El código se parece al siguiente:
- (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..
}];
¿Hay alguna manera de eliminar el flattenMap
código para poder suscribirme directamente al publicSignal
?
Gracias de antemano.
Solución
Bueno, podrías simplemente hacer lo flattenMap
adentro 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..
}];
Pero entonces ¿por qué estamos map
ping y luego inmediatamente flattenMap
¿silbido?Simplemente podemos decir:
- (RACSignal *)publicSignal {
return [[self privateSignal] flattenMap:^(NSString *code) {
return [self chainingSignalUsingCode:code];
}];
}
[[obj publicSignal] subscribeNext: ...
Para conseguir el mismo efecto.
Tener en cuenta que flattenMap
No es realmente "extraer el valor en la señal". Esta extrayendo todo los valores de todo las señales.Cuando privateSignal
envía nuevas señales, publicSignal
va a ser el siguiente para cada valorar eso cada envíos de señales: básicamente recordará todas las señales pasadas que privateSignal
envía y reenvía todos sus siguientes mensajes.Si esto es lo que quieres, entonces genial, funciona.Pero si sólo desea "desenvolver" la última señal, utilice switchToLatest
en lugar de flattenMap
.
Si no quieres modificar publicSignal
, y quieres que sea una señal de señales, puedes usar el más simple flatten
método y suscríbete a eso:
[[[obj publicSignal] flatten] subscribeNext: ...
Desde flattenMap
sin hacer nada equivale a flatten
(En realidad flatten
se implementa como un flattenMap
que simplemente devuelve su valor).O, si solo desea suscribirse a nexts desde la última señal que envía:
[[[obj publicSignal] switchToLatest] subscribeNext: ...
Pero mientras sea una señal de señales, es necesario realizar alguna operación para "desenvolverla".no hay ayuda flattenAndThenSubscribe
método, lo cual es bueno.Puede obtener el efecto que desea mediante la composición de primitivas simples.