Подтвердить что ты не робот

Обработка ошибок с помощью NSURLConnection sendSynchronousRequest

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

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

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

4b9b3361

Ответ 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