В 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?