Странная ошибка с initWithContentsOfURL
В настоящее время я работаю над чтением некоторого XML из внешнего API.
Следующий код работает нормально:
NSError *error = nil;
NSString *xmlString = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
Однако я хотел добавить обработку ошибок ("Не удается связаться с сервером", "Нет подключения к Интернету" и т. Д.). Итак, я поместил этот блок на место с небольшой помощью из примера кода Reachability:
if ([error code] == kCFURLErrorNotConnectedToInternet) {
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:NSLocalizedString(@"No Internet connection",@"Error message displayed when not connected to the Internet.") forKey:NSLocalizedDescriptionKey];
NSError *noConnectionError = [NSError errorWithDomain:NSCocoaErrorDomain code:kCFURLErrorNotConnectedToInternet userInfo:userInfo];
[self handleError:noConnectionError];
} else {
// otherwise handle the error generically
[self handleError:error];
}
Метод handleError просто отображает UIAlertView с деталями ошибки. Когда я запустил приложение без подключения, я ожидал увидеть свое сообщение об ошибке. Тем не менее, все, что я когда-либо получаю, это "Операция не может быть завершена (ошибка Какао 256)", что из того, что я могу собрать, является общей ошибкой чтения.
Сначала я подумал, что это может быть просто метод TouchXML, но, как вы можете видеть, я изменил это на initWithCOntentsOfURL из NSString.
Кто-нибудь может пролить свет на этот вопрос?
Спасибо,
Богатые
2 ответа
Вы видите какую-то другую ошибку, чем kCFURLErrorNotConnectedToInternet
, Сообщение об ошибке не исходит от вашей пользовательской ошибки, но генерируется каким-то объектом под капотом. Чтобы увидеть детали, вам нужно вывести сообщение userInfo об ошибке, которую вы действительно получили. Я бы регистрировал это вместо использования предупреждения, чтобы убедиться, что вы получите все это.
Если userInfo dict на самом деле пуст, я бы начал с проверки URL-адреса, чтобы увидеть, возвращает ли он что-нибудь. Попробуйте инициализировать объект данных и посмотрите, что вы получите. Это сузит его между проблемой с URL и проблемой с преобразованием данных в строку.
Попробуйте это: 1) Создать NSData, используя dataWithContentsOfURL 2) Не создавать xmlString только тогда, когда NSData, созданный выше, не равен нулю, т.е. проходит проверку, если (данные)