Verkettung abhängiger Signale in ReactiveCocoa

Wenn wir in ReactiveCocoa mehrere abhängige Signale verketten, müssen wir verwendensubscribeNext: für das nächste Signal in der Kette, um den Wert des vorherigen Signals zu empfangen, das erzeugt wurde (zum Beispiel ein Ergebnis einer asynchronen Operation). Nach einer Weile sieht der Code so aus (unnötige Details werden weggelassen):

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
    }];
}];

Diese stetig wachsende Verschachtelung sieht nicht viel besser aus als das nicht reaktive Beispiel in der Dokumentation:

[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];
}];

Vermisse ich etwas? Gibt es in ReactiveCocoa ein besseres Muster für verkettungsabhängige Arbeit?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage