2010-01-05 5 views
3

Je travaille actuellement sur la lecture de code XML à partir d'une API externe.Erreur étrange avec initWithContentsOfURL

Le code suivant fonctionne très bien:

NSError *error = nil; 

NSString *xmlString = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; 

Cependant, je voulais ajouter une gestion des erreurs (« Le serveur ne peut pas être atteint », « Pas de connexion Internet », etc.). Donc, je mets ce bloc en place avec un peu d'aide de l'exemple de code joignabilité:

if ([error code] == kCFURLErrorNotConnectedToInternet) { 
     NSDictionary *userInfo = [NSDictionary dictionaryWithObject:NSLocalizedString(@"No Internet connection",@"Error message displayed when not connected to the Internet.") forKey:NSLocalizedDescriptionKey]; 
     NSError *noConnectionError = [NSError errorWithDomain:NSCocoaErrorDomain code:kCFURLErrorNotConnectedToInternet userInfo:userInfo]; 
     [self handleError:noConnectionError]; 
    } else { 
     // otherwise handle the error generically 
     [self handleError:error]; 
    } 

La méthode handleError affiche simplement un UIAlertView avec les détails de l'erreur. Lorsque j'ai exécuté l'application sans connexion, je m'attendais à voir mon message d'erreur. Cependant, tout ce que j'obtiens est "l'opération n'a pas pu être complétée (erreur Cocoa 256)" qui, d'après ce que je peux comprendre, est une erreur de lecture générique. Au début, j'ai pensé que cela pourrait être la méthode de TouchXML, mais comme vous pouvez le voir, j'ai changé cela en initWithCOntentsOfURL de NSString.

Quelqu'un peut-il faire la lumière sur ce problème?

Merci,

Rich

+0

P.S .; 'initWithContentsOfURL:' est une méthode synchrone - donc enroulez-la dans un bloc NSOperation/GCD, ou passez à un réseau asynchrone. –

Répondre

0

Vous voir une autre erreur que kCFURLErrorNotConnectedToInternet. Le message d'erreur ne provient pas de votre erreur personnalisée mais est généré par un objet sous le capot. Vous devez vider le userInfo dict de l'erreur que vous obtenez réellement pour voir les détails. Je le connecte au lieu d'utiliser une alerte pour m'assurer que vous obtenez tout.

Si le userInfo dict est réellement vide, je commencerais par tester l'URL pour voir si elle retourne réellement quelque chose. Essayez d'initialiser un objet de données et voyez ce que vous obtenez. Cela va le réduire entre un problème avec l'URL et un problème avec la conversion des données en une chaîne.

+0

Lorsqu'il est connecté à Internet, le fichier XML est téléchargé et placé dans une chaîne ou un objet touchxml. C'est quand il n'est pas connecté que j'ai besoin de l'erreur - c'est juste que cette erreur semble être la mauvaise! Riches – Rich

0

Essayez ceci: 1) Créer NSData en utilisant dataWithContentsOfURL 2) Non créer xmlString que lorsque NSData créé ci-dessus est non nul, passe i.e. vérifier si (données)