Получение аргумента Исключение (аргумент nil URL)!
У меня возникла эта проблема, когда я получаю эту ошибку на моем iPhone:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSConcreteData initWithContentsOfURL:options:error:]: nil URL argument'
Я пытаюсь разобрать некоторые данные XML, когда я пытаюсь это сделать на симуляторе, я не получаю ошибки, но всякий раз, когда я пытаюсь сделать это на устройстве iOS, я получаю ошибку в своей консоли!
Это мой код для разбора XML:
- (ICB_WeatherConditions *)initWithQuery:(NSString *)query {
if (self = [super init])
{
CXMLDocument *parser = [[[CXMLDocument alloc] initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.google.com/ig/api?weather=%@", query]] options:0 error:nil] autorelease];
condition = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/current_conditions/condition" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] retain];
location = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_information/city" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] retain];
day2c = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_conditions/condition" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] retain];
day3c = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_conditions/condition" error:nil] objectAtIndex:1] attributeForName:@"data"] stringValue] retain];
currentTemp = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/current_conditions/temp_f" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] integerValue];
lowTemp = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_conditions[2]/low" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] integerValue];
highTemp = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_conditions/high" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] integerValue];
conditionImageURL = [[NSURL URLWithString:[NSString stringWithFormat:@"http://www.google.com%@", [[[[parser nodesForXPath:@"/xml_api_reply/weather/current_conditions/icon" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue]]] retain];
}
return self;}
и это мой код для отправки запроса:
- (void)showWeatherFor:(NSString *)query {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
ICB_WeatherConditions *weather = [[ICB_WeatherConditions alloc] initWithQuery:query];
self.conditionsImage = [[UIImage imageWithData:[NSData dataWithContentsOfURL:weather.conditionImageURL]] retain];
[self performSelectorOnMainThread:@selector(updateUI:) withObject:weather waitUntilDone:NO];
[pool release];}
Пожалуйста, помогите направить меня в правильном направлении! Еще раз спасибо!
2 ответа
Я ПОНЯЛ!
Итак, вот история и решение: я делал погодное приложение, и для запроса требовался город, чтобы получить действительный файл XML с данными. В моем симуляторе это место было ОТКЛЮЧЕНО, поэтому я оказался в Глендейле, Калифорния?! Как вы можете видеть, Глендейл - ОДНО СЛОВО. Поэтому, когда это вошло в запрос, оно прошло как действительный URL и получило данные. Когда я пошел на свой телефон, чтобы проверить это, я получил ошибку, указанную выше! Это было потому, что там, где я живу, название города, полученное из reverseGeocodeLocation от CLGeocoder, было 2 словами. (т.е. Де-Мойн). Пространство посередине все испортило. Очевидно, что вставка пробела в URL не вернет вам никаких данных. Чтобы получить пробел в "Службе сплевывания XML", которую я использовал, вы должны были использовать знак +. Итак, примерно через 4 часа отладки я выяснил это и вставил:
stringByReplacingOccurrencesOfString:@" " withString:@"+"
в конце моего метода, так что в конце это выглядело так:
City = [[placemark locality] stringByReplacingOccurrencesOfString:@" " withString:@"+"];
Это решило проблему, и теперь пробелы могут быть заменены знаками плюс, поэтому я получаю реальные данные обратно! Удачи всем, у кого похожая проблема!
Для начала: ошибка появляется в первой строке вашего if
заявление. Это создает строку и URL, и исключение составляет "аргумент нулевого URL". Итак, разбейте эту строку на части:
NSString *queryPath = [NSString stringWithFormat:@"http://www.google.com/ig/api?weather=%@", query];
NSURL *queryURL = [NSURL URLWithString:queryPath];
CXMLDocument *parser = [[[CXMLDocument alloc] initWithContentsOfURL:queryURL options:0 error:nil] autorelease];
Теперь вставьте код, чтобы проверить все - query
, queryPath
, queryURL
- и выдает ошибки, если значения не соответствуют вашим ожиданиям. Проблема должна стать очевидной.