Обработка ошибок с помощью NSURLConnection sendSynchronousRequest
как я могу улучшить обработку ошибок с помощью NSURLConnection sendSynchronousRequest? есть ли способ, которым я могу реализовать
- (void)connection:(NSURLConnection *)aConn didFailWithError:(NSError *)error
У меня есть очередь nsoperation, которая получает данные в фоновом режиме, поэтому у меня есть запрос синхронизации.
и если мне нужно выполнить запрос async, то как я могу ждать завершения запроса. потому что этот метод не может продолжаться без данных.
Ответы
Ответ 1
-sendSynchronousRequest: returnResponse: error: дает вам возможность получить ошибку прямо в самом методе. Этот последний аргумент действительно (ошибка NSError **); то есть указатель на указатель NSError. Попробуйте следующее:
NSError *error = nil;
NSURLResponse *response = nil;
[NSURLConnection sendSynchronousRequest: req returningResponse: &response error: &error];
if (error) {...handle the error}
Ответ 2
Я бы не стал полагаться на ошибку, которая не указана, чтобы указать, что произошла ошибка.
Я использую проверку ошибок, как описано в ответе Бена, но я считаю, что в некоторых случаях он генерирует ложноположительные/ложные ошибки.
В соответствии с этим SO answer, я изменяю, чтобы использовать результат метода для определения успеха/сбоя. И затем (и только после этого) проверьте указатель ошибки для получения сведений об ошибке.
NSError *requestError;
NSURLResponse *urlResponse = nil;
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError];
/* Return Value
The downloaded data for the URL request. Returns nil if a connection could not be created or if the download fails.
*/
if (response == nil) {
// Check for problems
if (requestError != nil) {
...
}
}
else {
// Data was received.. continue processing
}
Этот подход позволит избежать реакции на ошибку, возникшую в процессе загрузки, которая не привела к сбою. Я думаю, что возможно, что при загрузке он может столкнуться с некритическими ошибками, которые обрабатываются внутри фреймворка, и у них есть побочный эффект установки указателя ошибки с объектом ошибки.
Например, я получаю ошибки POSIX от пользователей, которые загрузили приложение, которое, похоже, произошло глубоко в обработке URL-адреса.
Этот код используется для сообщения об ошибке:
NSString *errorIdentifier = [NSString stringWithFormat:@"(%@)[%d]",requestError.domain,requestError.code];
[FlurryAPI logError:errorIdentifier message:[requestError localizedDescription] exception:nil];
И появляется сообщение об ошибке:
Platform: iPhone
Error ID: (NSPOSIXErrorDomain)[22]
Msg: Operation could not be completed. Invalid argument
Отображение этой информации..
requestError.domain = NSPOSIXErrorDomain
requestError.code = 22
[requestError localizedDescription] = Operation could not be completed. Invalid argument
Все, что мне удалось найти, это код ошибки 22 EINVAL
, но это не дало никаких дополнительных сведений.
Другие ошибки, которые я получаю, относятся к домену NSURL, который я полностью ожидаю в различных сетевых условиях:
NSURLErrorTimedOut
NSURLErrorCannotConnectToHost
NSURLErrorNetworkConnectionLost
NSURLErrorNotConnectedToInternet
+others