использование NSURLConnection вместо stringWithContentsOfURL

#iphone #xml #delegates

#iPhone #xml #делегирует

Вопрос:

Ребята, я извлекал XML-ответ из php-скрипта на моем сервере, используя следующий код:

  NSString *xmlString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString]
 encoding:NSUTF8StringEncoding error:amp;error];
  

и

 //tried also: if(error)
if(!xmlString)
{
    NSString * errorString = [NSString stringWithFormat:@"Unable to download xml data (Error code %i )", [error code]];
    UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Error loading content" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
    [errorAlert release];
}

//*** now I have a touchXML xPath query code that extracts what I need from XML
  

Мой php-скрипт сегодня не работал, и мое iApp зависало без каких-либо предупреждений, ошибок или уведомлений? Я думал, что приведенный выше код будет обрабатывать ошибки, но это не так???

А) Тогда какой тип ошибки он улавливает?

Затем я вспомнил, что я должен попробовать работать с NSURLConnection и его методами делегирования, чтобы перехватить любую возникающую ошибку.

 //Inside viewDidLoad method        
NSMutableData *responseData = [[NSMutableData alloc] init];

NSURL *baseURL = [[NSURL URLWithString:self.chosenDrawRss] retain];

NSURLRequest *request = [NSURLRequest requestWithURL:baseURL];

[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

NSString *xmlString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
  

Проблема, с которой я столкнулся при использовании этого подхода, заключалась в том, что приложение запустило соединение в фоновом режиме и продолжило выполнение остальной части кода, найденного в viewDidLoad, поэтому мне пришлось немного реорганизовать свой код, переместив его в другой метод, который я вызываю из делегированного метода connectionDidFinishLoading. Проблема, с которой я сталкиваюсь, заключается в том, что мои методы делегирования не вызываются. Ну, все, кроме didFailWithError: если я попытаюсь загрузить URL, который не существует.

ОБНОВЛЕНИЕ:
вызываются методы делегирования, но для вызова метода делегирования требуется около минуты и до тех пор, пока не появится предупреждающее сообщение …

Б) Могу ли я использовать stringWithContentsOfURL и по-прежнему получать оповещение пользователя, если что-то произойдет?

C) Если нет, то мне нужна помощь в настройке подхода NSURLConnection? Я имею в виду, чего мне здесь не хватает, так это почему не вызываются мои методы делегирования?

Я искренне надеюсь, что мои вопросы имеют смысл: D L

Комментарии:

1. Можете ли вы указать свой URL-адрес, если можете? Я попытался использовать фиктивный URL-адрес и получил ошибку.

2. Можете ли вы указать свой URL-адрес, если можете? Я попытался использовать фиктивный URL и получил ошибку при использовании stringWithContentsOfUrl

Ответ №1:

Если ваш метод делегирования вызывается в didFailWithError , то я полагаю, что он даже будет вызван в connectionDidFinishLoading . Проверьте, включив точку останова в методах делегирования, и отслеживайте поток. Возможно, это произошло, функция возвращает перед вызовом делегата.

 NSString *xmlString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding]
  

должно вызываться в вашем методе делегирования connectionDidFinishLoading и в

 - (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [responseData appendData:data];
}
  

Я не понимаю, почему предупреждение должно появиться через минуту, если вы не выполняете некоторую обработку перед его отображением.

Комментарии:

1. Прошу прощения, он запускает didFailWithError и показывает предупреждение примерно через минуту 🙂 Если нужно установить тайм-аут, это было бы здорово… Теперь вопрос о stringWithFormat все еще остается: когда мы должны использовать его, если он не может обрабатывать ошибки? Я имею в виду, Apple не разрешит приложению зависать, если URL недоступен… Спасибо … L

2. Выполняет ли ваш метод делегирования какую-либо другую обработку? NSString *xmlString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding] должно быть в ваших методах делегирования, а не там, куда вы отправляете запрос, поскольку запрос является асинхронным по своей природе.

3. Кажется, что одна минута ожидания поступает с сервера, у которого время ожидания для php-скрипта установлено на 60-70 секунд. Поскольку this .php получал XML с сервера, который был недоступен, я получил эту задержку в 1 минуту. Если я пытаюсь запросить URL, который не существует, я получаю предупреждающее сообщение через секунду… Итак, в заключение «первой части»: мое приложение хорошо работает с делегированием и NSURLConnection, но я все же хотел бы знать, когда мне следует использовать более удобный метод stringWithContentsOfURL , если обработка ошибок не может быть реализована таким образом, что Apple скажет «ПЕРЕДАНО» 🙂 спасибо за ваши комментарии