2009-01-10 7 views
5

Je suis avec this useful looking answer to my question.Faire des demandes GET et POST à ​​partir d'une application iPhone - Clarification nécessaire

Il semble fonctionner, mais voici mes deux questions:

  1. Comment détecter une erreur HTTP? La méthode didFailWithError ne semble pas être appelée?

MISE À JOUR:It considers any response a success. Donc je suppose que je dois gérer les erreurs HTTP dans la méthode didRecieveResponse, mais en plus de dire à l'utilisateur qu'il y avait une erreur quand j'ai rencontré une erreur HTTP, ai-je besoin d'arrêter la connexion? Et/ou nettoyage?

  1. Je vois cette ligne dans la réponse:
[[NSURLConnection alloc] initWithRequest:request delegate:self]; 

Ai-je besoin de libérer cela? Où, comment, quand?

Répondre

4

Vous obtiendrez le code d'état retourné dans le didReceiveResponse

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
    NSHTTPURLResponse *httpResponse; 
    httpResponse = (NSHTTPURLResponse *)response; 
    int statusCode = [httpResponse statusCode]; 
    //statusCode will be the http code returned like 201,500 
} 

Pour arrêter la connexion, utilisez une variable de niveau classe pour la connexion. La meilleure façon de procéder serait de créer un wrapper qui envoie des requêtes et reçoit une réponse. Faites de votre viewcontroller un délégué de cette classe et chaque fois que didReceiveResponse donne un code d'état d'erreur, appelez la méthode appropriée du délégué et arrêtez la connexion.

est ici une bonne classe wrapper exemple

http://kosmaczewski.net/projects/objective-c-rest-client/

3

Oui, vous devez libérer cet objet. Voir le Memory Management Programming Guide for Cocoa. Fondamentalement, si vous créez un objet avec un nom de méthode qui commence par alloc ou new ou contient copy, vous devenez propriétaire de l'objet et vous devez le libérer plus tard. Seulement dans le cas où vous savez que vous aurez besoin de l'objet jusqu'à la fin du programme, il est autorisé de ne pas le libérer, auquel cas le système d'exploitation récupère la mémoire lorsque votre application se termine.

Si vous avez seulement besoin de l'objet dans un petit cadre, vous pouvez lui envoyer le message autorelease. Cela l'ajoutera au pool autorelease. Le pool autorelease envoie périodiquement un message release à chaque objet qui s'y trouve. C'est un peu compliqué; Voir la section sur autorelease pools. Par exemple:

Dans ce cas, cependant, étant donné que NSURLConnection s sont asynchrones, la libération automatique ne fonctionnera pas. Vous ne savez pas exactement quand il va rappeler dans votre objet avec des données, donc vous voulez vous assurer que l'objet n'a pas encore été libéré. La seule façon d'être sûr est de savoir exactement quand vous avez terminé avec l'objet, puis de lui envoyer un message release vous-même.

Toutes les différentes init* fonctions renvoient un pointeur sur l'objet donné, vous pouvez juste faire:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
... 
// when done with connection: 
[connection release]; 
+0

C'est ce que je pensais. Je suis confus comment le libérer car il n'a pas de nom? – Greg

0

Répondant à la question dans votre "mise à jour" ...

Désactivez automatiquement la connexion NSURLC. L'objet de connexion est conservé par NSRunLoop (auquel il s'ajoute automatiquement sauf si vous utilisez le constructeur startImmediately: NO). Il sera automatiquement retiré de la boucle d'exécution (et donc dealloc'd) en cas d'erreur ou de fin.