как я могу сделать лучшую обработку ошибок с NSURLConnection sendSynchronousRequest? есть ли любой способ, которым я могу реализовать
- (void)connection:(NSURLConnection *)aConn didFailWithError:(NSError *)error
у меня есть nsoperation очередь, которая получает данные в фоне вот почему, у меня есть синхронизирующий запрос. и если я должен реализовать асинхронный запрос тогда, как я могу ожидать запроса для получения завершенным. потому что тот метод не может продолжиться без данных.
-SendsynchronousRequest: ReturningResponse: Ошибка: дает вам способ получить ошибку прямо там в самом методе. Этот последний аргумент действительно (NSError **) ошибка; То есть указатель на указатель NSError. Попробуйте это:
NSError *error = nil;
NSURLResponse *response = nil;
[NSURLConnection sendSynchronousRequest: req returningResponse: &response error: &error];
if (error) {...handle the error}
Я бы не стал полагаться на то, что ошибка не равна нулю, чтобы указать, что произошла ошибка.
Я использовал проверку ошибок, как описано в ответе Бена, но считаю, что в некоторых случаях она генерирует ложноположительные / ложные ошибки.
В соответствии с этим ответом SO , я изменяюсь, чтобы использовать результат метода для определения успеха / неудачи. И затем (и только тогда) проверьте указатель ошибки, чтобы узнать подробности сбоя.
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