Используя NSURLConnection вместо stringWithContentsOfURL
Ребята, я получал ответ XML из скрипта.php на моем сервере, используя следующий код:
NSString *xmlString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString]
encoding:NSUTF8StringEncoding error:&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];
Проблема, с которой я столкнулся при использовании этого подхода, заключалась в том, что приложение запускало Connection в фоновом режиме и продолжало выполнять остальную часть кода, найденного в viewDidLoad, поэтому мне пришлось немного реорганизовать свой код, переместив его в другой метод, который я вызываю из метода делегата connectionDidFinishLoading., У меня проблема в том, что мои методы делегата не вызываются. Ну, все, кроме didFailWithError: если я пытаюсь загрузить URL, который не существует.
ОБНОВЛЕНИЕ: методы делегата вызываются, но требуется около одной минуты для вызова метода делегата и до тех пор, пока не появится всплывающее сообщение...
Б) Могу ли я использовать stringWithContentsOfURL и при этом иметь предупреждение для пользователя, если что-то случится?
C) Если нет, то мне нужна помощь с настройкой подхода NSURLConnection? Я имею в виду, что мне здесь не хватает, почему не вызываются мои методы делегата?
Я искренне надеюсь, что мои вопросы имеют смысл:D L
1 ответ
Если ваш метод делегата вызывается в didFailWithError
тогда я полагаю, что это даже будет вызваноconnectionDidFinishLoading
, Проверьте, включив точку останова в методах делегата и отследите поток. Может случиться так, что функция вернется до вызова делегата.
NSString *xmlString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding]
должен быть вызван в вашем делегате connectionDidFinishLoading
метод и в
- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[responseData appendData:data];
}
Я не понимаю, почему предупреждение должно появиться через минуту, если вы не выполняете какую-либо обработку перед его отображением.