Получение аргумента Исключение (аргумент 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 - и выдает ошибки, если значения не соответствуют вашим ожиданиям. Проблема должна стать очевидной.

Другие вопросы по тегам