¿Cómo hacer que RACSignal se caliente?

ReactiveCocoa puede convertir la señal a la señal "caliente" llamando a su -subscribeCompleted: Pero creo que este método es bastante detallado.

Es bastante detallado si no te importa el resultado (es decir, no hay suscriptores).

 RACDisposable *animationDisposable = [[self play:animation] subscribeCompleted:^{ // just to make the animation play }]; 

Y estas 3 líneas no son lo suficientemente expresivas como para mostrar mi intención.

¿Hay algún método para un propósito similar? ¡Gracias!

No quiero hacer nada más que calentar (= hacer que se ejecute una vez).

"Sigues usando esa palabra. No creo que signifique lo que crees que significa".

Una "señal activa" es una señal que envía valores (y presumiblemente funciona) independientemente de si tiene algún suscriptor. Una "señal fría" es una señal que difiere su trabajo y el envío de cualquier valor hasta que tenga un suscriptor. Y una señal fría realizará su trabajo y enviará valores para cada suscriptor.

Si desea hacer que una señal fría se ejecute solo una vez, pero tiene múltiples suscriptores, debe multidifundir la señal. La multidifusión es un concepto bastante simple, que funciona así:

  1. Cree un RACSubject para proxy los valores enviados por la señal que desea ejecutar una vez.
  2. Suscríbete al tema tantas veces como sea necesario.
  3. Cree una única suscripción a la señal que desea ejecutar solo una vez, y por cada valor enviado por la señal, envíela al sujeto con [subject sendNext:value] .

Sin embargo, puede y debe usar RACMulticastConnection para hacer todo lo anterior con less código:

 RACMulticastConnection *connection = [signal publish]; [connection.signal subscribe:subscriberA]; [connection.signal subscribe:subscriberB]; [connection.signal subscribe:subscriberC]; [connection connect]; // This will cause the original signal to execute once. // But each of subscriberA, subscriberB, and subscriberC // will be sent the values from `signal`. 

Si no le importa la salida de la señal (y, por alguna razón, realmente quiere que la reproducción sea una señal), es posible que desee hacer un command. Un command hace que una señal se ejecute a través de algún tipo de evento (como un button de ui presionar u otro evento). Simplemente cree la señal, agréguela a un command, luego cuando necesite ejecutarlo, ejecútelo.

 @weakify(self); RACCommand * command = [[RACCommand alloc] initWithSignalBlock:^(id input) { @strongify(self); return [self play:animation]; }]; //This causes the signal to be ran [command execute:nil]; //Or you could assign the command to a button so it is executed // when the button is pressed playButton.rac_command = command;