В ReactiveCocoa, ако свързваме няколко зависими сигнала, трябва да използваме subscribeNext:
за следващия сигнал във веригата, за да получим стойността, произведена от предишния сигнал (например резултат от асинхронна операция). След известно време кодът се превръща в нещо подобно (ненужните подробности са пропуснати):
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
}];
}];
Това непрекъснато нарастващо влагане не изглежда много по-добре от нереактивния пример, който е даден в документацията:
[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];
}];
Изпускам ли нещо? Има ли по-добър модел на верижно зависима работа в ReactiveCocoa?