Тайм-аут запроса веб-службы iPhone

У меня проблемы с приложением для iphone из-за слабого сигнала Wi-Fi. Мое приложение использует веб-сервис для удаления данных с нашего сервера, но когда сигналы Wi-Fi слабые, ответ никогда не возвращается, и пользователь застревает на оверлейном экране «Загрузка ...». Наконец приложение вылетает в конце. Как я могу изящно справиться с этой ситуацией. Есть ли способ установить TimeOut для вызовов моих веб-сервисов или что-то в этом роде?

Спасибо, Асиф.


person Asif    schedule 18.05.2011    source источник
comment
Как вы делаете эти вызовы веб-сервисов? NSURLConnection? initWithContentsOfURL: или тому подобное в NSString, NSDictionary или подобном? Сторонняя библиотека?   -  person Anomie    schedule 18.05.2011


Ответы (3)


попробуйте использовать ASIHTTP lib

http://allseeing-i.com/ASIHTTPRequest/How-to-use

person elp    schedule 18.05.2011

Возможно, вы захотите узнать об ASIHTTPRequest, поскольку он предлагает гораздо больше, чем стандартный API CFNetwork. Код прост, а также обработка ошибок:

- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
   // Use when fetching text data
   NSString *responseString = [request responseString];

   // Use when fetching binary data
   NSData *responseData = [request responseData];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}
person alex    schedule 18.05.2011

Вы можете установить тайм-аут NSURLConnection и делегата, чтобы он отвечал на селектор connection:didFailWithError:. См. Этот S.O. тема.

если ваш делегат никогда не вызывается, это почему-то известная проблема. Единственный обходной путь, похоже, заключается в том, чтобы настроить ваш собственный NSTimer на срабатывание через некоторое время и отменить запрос. Это определенно неловко, но не должно быть так сложно.

Если вам интересно узнать причину проблемы с тайм-аутом, возможно, она связана с медленным запуском подсистемы 3G в iPhone.

person sergio    schedule 18.05.2011
comment
Я использовал инструмент WSDL2ObjC для использования веб-службы в приложении iphone. WSDL2ObjC создает класс xMyService.m, который содержит следующий код для NSURLConnection с таймаутом запроса 10 секунд. Но когда сигналы WI-FI слабые, запрос застревает и время ожидания соединения 10 секунд не работает. NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL: self.address cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval: 10.0]; NSURLConnection * соединение = [[выделение NSURLConnection] initWithRequest: делегат запроса: операция]; - person Asif; 19.05.2011
comment
@asif: итак, вы пробовали изменить значение timeoutInterval? Есть улучшения? - person sergio; 19.05.2011
comment
да, я пробовал значения меньше 10, но это тоже не работает. и приложение показывает индикатор активности на неопределенное время. - person Asif; 20.05.2011
comment
Если ваше приложение показывает индикатор активности в течение неопределенного времени, это может быть связано с тем, что вы не удаляете индикатор активности по истечении времени ожидания соединения. Что именно вы делаете в себе connection:didFailWithError:? - person sergio; 20.05.2011
comment
Индикатор активности не убирается, если сигналы wi-fi слабые, и ответ не возвращается. В нормальной ситуации, когда уровень сигнала Wi-Fi хороший, приложение работает правильно, и индикатор активности удаляется сразу после получения ответа. - person Asif; 20.05.2011
comment
connection: didFailWithError выглядит так. - (void) connection: (NSURLConnection *) connection didFailWithError: (NSError *) error {// Здесь отображается сообщение о сбое сети. если (binding.logXMLInOut) {NSLog (@ResponseError: \ n% @, ошибка); } response.error = ошибка; [делегировать операцию: самостоятельно завершеноWithResponse: response]; } - person Asif; 20.05.2011
comment
Обратите внимание, что в случае слабых сигналов Wi-Fi соединение: didFailWithError никогда не вызывается. - person Asif; 20.05.2011