обработка ошибок с NSURLConnection sendSynchronousRequest - PullRequest
19 голосов
/ 15 января 2010

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

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

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

Ответы [ 2 ]

55 голосов
/ 24 марта 2010

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

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

Согласно этому 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
29 голосов
/ 15 января 2010

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

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

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

if (error) {...handle the error}
...