rxswift reactivecocoa ios objective-c reactive-programming reactive-cocoa

ios - rxswift - Encadenamiento de señales dependientes en ReactiveCocoa



reactivecocoa swift (1)

Esto es cuando los operadores RACStream y RACSignal comienzan a ser realmente útiles. En su ejemplo particular, puede usar -flattenMap: para incorporar resultados en nuevas señales:

[[[buttonClickSignal flattenMap:^(UIButton *sender) { // prepare ''username'' and ''password'' return [self logInWithUsername:username password:password]; }] flattenMap:^(NSDictionary *json) { // prepare ''token'' return [self fetchPlaylistForToken:token]; }] subscribeNext:^(NSDictionary *json) { // do stuff with the returned playlist data }];

Si no necesita los resultados de ningún paso, puede usar -sequenceMany: o -sequenceNext: lugar de un efecto similar (pero para una expresión de intención más clara).

En ReactiveCocoa, si encadenamos varias señales dependientes, debemos usar subscribeNext: para la siguiente señal en la cadena para recibir el valor de la señal previa producida (por ejemplo, un resultado de una operación asincrónica). Entonces, después de un tiempo, el código se convierte en algo como esto (se omiten detalles innecesarios):

RACSignal *buttonClickSignal = [self.logIn rac_signalForControlEvents:UIControlEventTouchUpInside]; [buttonClickSignal subscribeNext:^(UIButton *sender) { // signal from a button click // prepare data RACSignal *loginSignal = [self logInWithUsername:username password:password]; // signal from the async network operation [loginSignal subscribeNext:^void (NSDictionary *json) { // do stuff with data received from the first network interaction, prepare some new data RACSignal *playlistFetchSignal = [self fetchPlaylistForToken:token]; // another signal from the async network operation [playlistFetchSignal subscribeNext:^(NSDictionary *json) { // do more stuff with the returned data }]; // etc }]; }];

Este nido cada vez mayor no se ve mucho mejor que el ejemplo no reactivo que se proporciona en la documentación:

[client logInWithSuccess:^{ [client loadCachedMessagesWithSuccess:^(NSArray *messages) { [client fetchMessagesAfterMessage:messages.lastObject success:^(NSArray *nextMessages) { NSLog(@"Fetched all messages."); } failure:^(NSError *error) { [self presentError:error]; }]; } failure:^(NSError *error) { [self presentError:error]; }]; } failure:^(NSError *error) { [self presentError:error]; }];

¿Me estoy perdiendo de algo? ¿Hay un mejor patrón para encadenar el trabajo dependiente en ReactiveCocoa?