web-dev-qa-db-fra.com

Gestion des erreurs avec NsurlConnection SendSynchronouseQuest

comment puis-je faire une meilleure manipulation des erreurs avec NsurlConnection SendSynchronouseQuest? Y a-t-il un moyen que je puisse mettre en œuvre

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

j'ai une file d'attente Nsoperation qui obtient des données de base, c'est pourquoi j'ai une demande de synchronisation. Et si je dois mettre en œuvre la demande ASYNC, comment puis-je attendre que la demande soit complète. Parce que cette méthode ne peut pas continuer sans données.

19
Nnp

-SendSynchronouseQuest: RetournerResponse: Erreur: vous donne un moyen d'obtenir une erreur juste dans la méthode elle-même. Ce dernier argument est vraiment (nserror **) erreur; C'est-à-dire un pointeur à un pointeur NSERROR. Essaye ça:

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

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

if (error) {...handle the error}
29
Ben Gottlieb

Je ne voudrais pas dépendre de l'erreur non nul pour indiquer qu'une erreur est survenue.

J'utilise la vérification des erreurs comme décrit dans la réponse de Ben, mais je pense qu'il génère des erreurs faussement positives/faux dans certaines circonstances.

Selon ceci So Réponse , je change pour utiliser le résultat de la méthode pour déterminer le succès/l'échec. Et ensuite (et seulement alors) Vérifiez le pointeur d'erreur pour plus de détails sur l'échec.

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
}

Cette approche évite de réagir à une erreur survenue dans le processus de téléchargement qui ne l'a pas fait échouer. Je pense qu'il est possible que le téléchargement se produise peut rencontrer des erreurs non critiques qui sont traitées dans le cadre et elles ont l'effet secondaire de la définition du pointeur d'erreur avec un objet d'erreur.

Par exemple, j'ai reçu des erreurs de POSIX signalées à partir d'utilisateurs qui ont téléchargé l'application qui semblait avoir eu lieu au profit du traitement de la connexion de l'URL.

Ce code est utilisé pour signaler l'erreur:

NSString *errorIdentifier = [NSString stringWithFormat:@"(%@)[%d]",requestError.domain,requestError.code];
[FlurryAPI logError:errorIdentifier message:[requestError localizedDescription] exception:nil];

Et l'erreur apparaît rapportée comme suit:

Platform: iPhone
Error ID: (NSPOSIXErrorDomain)[22]
Msg: Operation could not be completed. Invalid argument

Cartographie qui en arrière ..

requestError.domain = NSPOSIXErrorDomain
requestError.code = 22
[requestError localizedDescription] = Operation could not be completed. Invalid argument

Tout ce que j'ai pu creuser, ce code d'erreur 22 est EINVAL, mais cela n'a donné aucun autre détail.

D'autres erreurs que je reçoivent viennent du domaine NSURL, que j'attends totalement dans des conditions de réseau divers:

NSURLErrorTimedOut
NSURLErrorCannotConnectToHost
NSURLErrorNetworkConnectionLost
NSURLErrorNotConnectedToInternet
+others
55
ohhorob