¿Por qué SignalProducer no devuelve una señal?

Siento que entiendo todos los componentes básicos de ReactiveCocoa (conceptualmente), al comprender cómo conectar todas las piezas es aún un poco confuso.

Por ejemplo, después de leer acerca de la señal, esperaba completamente que SignalProducer tuviera un solo método start () que devolviera una señal, que usted usaría como tal:

mySignalProducer.start().observe(myObserver) 

En cambio, debe pasar un observador a start () y las llamadas de SignalProducer observe () para usted:

 mySignalProducer.start(myObserver) 

Esto significa que la interfaz de SignalProducer es mucho más grande (más que comprender), porque todas las variaciones de observe () tienen que ser duplicadas en start () (por ejemplo, startNext (), etc.).

Creo que hay dos posibilidades aquí:

  1. Existen razones técnicas por las que start () no puede simplemente devolver una señal
  2. No entiendo conceptualmente el SignalProducer, lo que lleva a las expectativas de su interfaz.

Si 1 es el caso, supongo que tiene algo que ver con la gestión de la memory y los desechables que aún no entiendo por completo.

Estoy más preocupado de que 2 sea el caso. Internamente, mi comprensión de SignalProducer se basa básicamente en el concepto de una fábrica, por ejemplo:

 mySignalFactory.createSignal().observe(myObserver) 

por lo que me sorprende que no encontremos un inicio () que devuelva una señal.

Agradecería enormemente si la comunidad pudiera arrojar algo de luz aquí.

¡Gracias!

Creo que la razón principal es que algunos events pueden enviarse inmediatamente cuando comienza el productor.

Por ejemplo, si no le gusta la interfaz de la serie de inicio y desea get una señal directamente al inicio:

 extension SignalProducer { func getSignalFromStart() -> Signal<Value, Error> { var signal: Signal<Value, Error>! startWithSignal{ innerSignal, _ in signal = innerSignal } return signal } } 

Entonces puedes perderte algunos events. Prueba esto:

 // When property.producer starts, it will send its current value immediately let property = MutableProperty(1) property.producer.getSignalFromStart().observeValues { value in print("getSignalFromStart \(value)") // maybe not what you want, only gets 2 } property.producer.startWithValues { value in print("normal start \(value)") // this normally gets 1 and 2 } property.value = 2