обработка ошибок с NSURLConnection sendSynchronousRequest

как я могу сделать лучшую обработку ошибок с NSURLConnection sendSynchronousRequest? есть ли любой способ, которым я могу реализовать

- (void)connection:(NSURLConnection *)aConn didFailWithError:(NSError *)error

у меня есть nsoperation очередь, которая получает данные в фоне вот почему, у меня есть синхронизирующий запрос. и если я должен реализовать асинхронный запрос тогда, как я могу ожидать запроса для получения завершенным. потому что тот метод не может продолжиться без данных.

19
задан Nnp 15 January 2010 в 02:21
поделиться

2 ответа

-SendsynchronousRequest: ReturningResponse: Ошибка: дает вам способ получить ошибку прямо там в самом методе. Этот последний аргумент действительно (NSError **) ошибка; То есть указатель на указатель NSError. Попробуйте это:

NSError        *error = nil;
NSURLResponse  *response = nil;

[NSURLConnection sendSynchronousRequest: req returningResponse: &response error: &error];

if (error) {...handle the error}
29
ответ дан 30 November 2019 в 01:53
поделиться

Я бы не стал полагаться на то, что ошибка не равна нулю, чтобы указать, что произошла ошибка.

Я использовал проверку ошибок, как описано в ответе Бена, но считаю, что в некоторых случаях она генерирует ложноположительные / ложные ошибки.

В соответствии с этим ответом 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
55
ответ дан 30 November 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: