2009-02-27 9 views
3

J'utilise le code du document d'Apple pour faire une communication HTTP. Je peux me connecter à l'URL avec succès, mais j'ai échoué à recevoir les données de mon serveur.Comment puis-je recevoir des données d'une URL sur iPhone?

// create the request 
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://..."] 
                        cachePolicy:NSURLRequestUseProtocolCachePolicy 
                     timeoutInterval:60.0]; 
// create the connection with the request 
// and start loading the data 
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
if (theConnection) { 
    // Create the NSMutableData that will hold 
    // the received data 
    // receivedData is declared as a method instance elsewhere 
    NSMutableData *receivedData=[[NSMutableData data] retain]; 
} else { 
    // inform the user that the download could not be made 
} 

La raison peut être:

  1. Je déclare receivedData dans l'action elle-même. L'annotation dit que je devrais le déclarer ailleurs. Où dois-je le déclarer? Dois-je le déclarer comme propriété du contrôleur?

  2. Comment peut-[[NSMutableData data] retain] trouver l'URL comme il est en dehors de la if{}?

+0

Tom Harrington a tous les détails techniques vers le bas pat, mais si vous voulez voir ce qu'il décrit de travail, dans l'action, [un coup d'oeil à la source GitHub soit mon application iPhone démonstration/formation] (http: //github.com/matthewmccullough/iphoneandjavawebservices/tree/master) ou [par des codeurs beaucoup plus avancés que l'application Git-Phone.] (http://github.com/sschroed/git-phone/tree/master) Ces deux exemples d'application font l'appel exact dont vous avez besoin, et l'apprentissage par l'exemple est souvent le meilleur moyen. –

Répondre

5

Lorsque vous utilisez initWithRequest de NSURLConnection: délégué: méthode, les données (ainsi que d'autres choses) est envoyé à l'objet délégué dans une séquence d'appels de méthode. Les méthodes sont toutes facultatives, donc si votre objet délégué ne les implémente pas, l'objet connexion les ignore.

Il y a un tas de méthodes, donc je ne vais pas toutes les énumérer ici, mais elles sont toutes décrites en détail dans la documentation de NSURLConnection. Pour obtenir les données reçues, vous devez implémenter -connection: didReceiveData: sur l'objet délégué. Cette méthode sera appelée, potentiellement plus d'une fois, avec un objet NSData représentant les données nouvellement reçues. Vous pouvez ensuite l'ajouter à votre objet NSMutableData existant, ou faire tout ce qui est logique avec celui-ci. Vous saurez que vous avez reçu toutes les données lorsque -connectionDidFinishLoading: est appelé sur l'objet délégué.

Pour répondre à vos deux questions spécifiques:

  1. Oui, vous devez le déclarer comme propriété de l'objet contrôleur. Vous devez également veiller à allouer l'objet AVANT d'appeler initWithRequest: delegate: de NSURLConnection, car la connexion commencera à charger les données de manière asynchrone dès que l'objet de connexion est créé. Alternativement, vous pouvez implémenter -connection: didReceiveResponse: sur le délégué, vérifier l'état HTTP, puis créer l'objet de données. L'objet de données mutable ne peut pas trouver l'URL, la connexion ou ses données telles que vous les avez configurées, mais si vous suivez les étapes que j'ai décrites, vous pouvez y ajouter des données. entre, et l'utilise quand la connexion se termine.

Questions connexes