¿Cómo suscribir directamente una señal de señal sin flattenMap cuando se usa ReactiveCocoa?

StackOverflow https://stackoverflow.com//questions/23015828

  •  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.

¿Fue útil?

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 mapping 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top