2010-07-24 6 views
0

mon application est censée faire une requête d'un serveur toutes les 10 secondes environ avec une URL spécifique, modifier certains attributs dans l'URL, puis afficher la demande dans une autre vue appelée "updateView" ou si un réseau erreur s'est produite afficher l'erreur. La première partie fonctionne très bien mais si je change de wifi par exemple, l'application plante. Comment puis-je résoudre ce problème et comment puis-je afficher les différentes erreurs? Merci d'avance!! Voici mon code (ce qui est la méthode qui est appelée toutes les 10 secondes):NSURL Error Handling

- (void)serverUpdate{ 
CLLocationCoordinate2D newCoords = self.location.coordinate; 

gpsUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://odgps.de/chris/navextest?objectid=3&latitude=%2.4fN&longitude=%2.4fE&heading=61.56&velocity=5.21&altitude=%f&message=Eisberg+voraus%21", newCoords.latitude, newCoords.longitude, self.location.altitude]]; 

self.pageData = [NSString stringWithContentsOfURL:gpsUrl]; 


[updateView.transmissions insertObject:pageData atIndex:counter]; 
if (counter == 100) { 
    [updateView.transmissions removeAllObjects]; 
    counter = -1; 
} 
counter = counter + 1; 



    [updateView.tableView reloadData]; 
self.sendToServerSuccessful = self.sendToServerSuccessful + 1; 
[self.tableView reloadData]; 
} 

Répondre

3

D'abord, vous bloquez le thread principal pendant qu'il attend que l'opération réseau se termine lorsque vous appelez stringWithContentsOfURL: et c'est une mauvaise chose car si le réseau est lent ou inaccessible, il semblera que votre application a planté.

Deuxièmement, stringWithContentsOfURL: est dépréciée et vous devez utiliser ce lieu, même si elle bloque toujours le fil conducteur:

self.pageData = [NSString stringWithContentsOfURL:gpsURL encoding:NSUTF8StringEncoding error:nil]; 

Vous devez utiliser NSURLConnection pour télécharger les données sans bloquer le thread principal. Créez un NSURLRequest à partir de l'URL, transmettez-le à [NSURLConnection connectionWithRequest:request delegate:self]; qui démarre la connexion URL.

est ici un code pour le délégué NSURLConnection:

- (void)connection:(NSURLConnection *)aConnection didReceiveResponse:(NSURLResponse *)response { 
    if ([response isKindOfClass: [NSHTTPURLResponse class]]) { 
     statusCode = [(NSHTTPURLResponse*) response statusCode]; 
     /* HTTP Status Codes 
      200 OK 
      400 Bad Request 
      401 Unauthorized (bad username or password) 
      403 Forbidden 
      404 Not Found 
      502 Bad Gateway 
      503 Service Unavailable 
     */ 
    } 
    self.receivedData = [NSMutableData data]; 
} 

- (void)connection:(NSURLConnection *)aConnection didReceiveData:(NSData *)data { 
    [self.receivedData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection { 
    // Parse the received data 
    [self parseReceivedData:receivedData]; 
    self.receivedData = nil; 
} 

- (void)connection:(NSURLConnection *)aConnection didFailWithError:(NSError *)error { 
    statusCode = 0; // Status code is not valid with this kind of error, which is typically a timeout or no network error. 
    self.receivedData = nil; 
} 
+0

Grand Je pense que cela vous aidera beaucoup merci beaucoup! Mais qu'est-ce que je fais si je veux aussi afficher ma demande (l'URL avec les attributs que j'ai définis précédemment) parce que maintenant je peux seulement afficher le code d'état à droite? –

+0

et de quel type est la variable "statusCode"? –

+0

statusCode est un int. Pour afficher la requête, cela dépend du format de la réponse, mais un UIWebView fonctionnera probablement. – lucius

0

Ne les modifications suivantes:

1.Changing l'appel à

+ (id)stringWithContentsOfURL:(NSURL 
*)url encoding:(NSStringEncoding)enc error:(NSError **)error 

actuellement vous utilisez stringWithContentsOfURL.

2.Comptez la valeur nulle de ce retour d'appel. S'il y a une erreur dans l'exécution de l'URL, l'appel renvoie un objet nul. Dans l'implémentation actuelle, vous ajoutez juste l'objet return API (je pense que cela pourrait être la raison de votre crash)