Я сделал логин, который подключен к кнопке в ReactiveCocoa. Даже я протестировал этот кусок кода, и, похоже, он работает правильно, я не уверен, правильно ли я это сделаю. Сигнал входа в систему возвращает «следующий» в случае успеха и «ошибки» в любом другом случае. Поскольку я не хочу, чтобы кнопка была отписана при ошибке, я использую функцию catch.Правильно ли это выполнение тайм-аута в Reactive Cocoa?
Что я хочу: я хочу, чтобы тайм-аут срабатывал через 2 секунды, если loginSignal не был запущен. Правильно ли это сделано? Правильно ли это «реактивный путь»?
[[[[self.loginButton rac_signalForControlEvents:UIControlEventTouchUpInside]
doNext:^(id x) {
[self disableUI];
}]
flattenMap:^(id value) {
return [[[[[self.login loginSignalWithUsername:self.usernameTextField.text
andPassword:self.passwordTextField.text]
catch:^RACSignal *(NSError *error) {
[self enableUI];
[self showAlertWithTitle:NSLocalizedString(@"ERROR_TITLE", @"Error")
message:NSLocalizedString(@"LOGIN_FAILURE", @"Login not successful.")];
return [RACSignal empty];
}]
deliverOn:[RACScheduler mainThreadScheduler]]
timeout:2.0 onScheduler:[RACScheduler mainThreadScheduler]]
catch:^RACSignal *(NSError *error) {
[self enableUI];
[self showAlertWithTitle:NSLocalizedString(@"TIMEOUT_TITLE", @"Timeout occured")
message:NSLocalizedString(@"REQUEST_NOT_POSSIBLE", @"Server request failed")];
return [RACSignal empty];
}];
}]
subscribeNext:^(id x) {
[self enableUI];
// Go to next page after login
}];
Это выглядит отлично! Благодаря! Еще один вопрос: похоже, что тайм-аут определяет, когда я получу какой-либо ответ. Как я могу получить завершенный сигнал, как только он появится? Тайм-аут должен срабатывать только в том случае, если я не получу ответа за это время. – beseder
Я никогда не использовал таймаут, но смотрел на код, который, похоже, не задерживает исходный полный сигнал. У вас есть более подробная информация о вашем loginSignal? – kamidude
Я работал с sendNext: 'on Error внутри моего loginSignal, так как у меня были проблемы с отмененными подписками в прошлом при использовании ошибки. Теперь я использую isendError: «при любой ошибке, и теперь это работает как шарм !!! Большое спасибо!! – beseder