Я все еще довольно новичок в мире ReactiveCocoa, и я просто хотел, чтобы этот общий сценарий был прояснен. Я заметил, что другие люди борются с этим вопросом на GitHub и SO, но я до сих пор не получил правильного ответа.Обработка следующего, завершена и ошибка в ReactiveCocoa
Следующий пример действительно работает, но я видел, что Джастин Саммерс говорит, что подписка на подписку или подписки вообще может быть запахом кода. Поэтому я хочу попытаться избежать вредных привычек при изучении этой новой парадигмы.
Таким образом, пример (с использованием MVVM) довольно прост:
- ViewController содержит кнопку входа, который подключен к команде входа в ViewModel
- ViewModel определяет действия команды и имитирующих некоторые сетевой запрос для этого примера.
- ViewController подписывается на исполняемые символы команды и может дифференцировать три типа возвратов: далее, ошибка и завершение.
И код.
1 (ViewController):
RAC(self.loginButton, rac_command) = RACObserve(self, viewModel.loginCommand);
2 (ViewModel):
self.loginCommand = [[RACCommand alloc] initWithEnabled:canLoginSignal
signalBlock:^RACSignal *(id input) {
return [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
BOOL success = [username isEqualToString:@"user"] && [password isEqualToString:@"password"];
// Doesn't really make any sense to use sendNext here, but lets include it to test whether we can handle it in our viewmodel or viewcontroller
[subscriber sendNext:@"test"];
if (success)
{
[subscriber sendCompleted];
} else {
[subscriber sendError:nil];
}
// Cannot cancel request
return nil;
}] materialize];
}];
3 (ViewController):
[self.viewModel.loginCommand.executionSignals subscribeNext:^(RACSignal *execution) {
[[execution dematerialize] subscribeNext:^(id value) {
NSLog(@"Value: %@", value);
} error:^(NSError *error) {
NSLog(@"Error: %@", error);
} completed:^{
NSLog(@"Completed");
}];
}];
Как бы вы сделать это в более ReactiveCococa- вид-а-путь?
Спасибо за ответ. Я согласен с вашим предоставленным подходом, и это очень похоже на то, с чем я закончил.Ваше объяснение о том, почему использовать concat в отличие от сглаживания, было очень полезно! –