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