2013-07-08 3 views
-1

Je souhaite récupérer des données pour un tableau d'URL renvoyant des données JSON. J'essaie le code suivant:Plusieurs demandes JSON dans iOS

for (int i =0; i<numberOfDays; i++) 
{ 
    NSData *data = [NSData dataWithContentsOfURL:[wordURLs objectAtIndex:i]]; 
    NSLog(@"%@",[wordURLs objectAtIndex: i]); 
    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES]; 
} 

« wordURLs » sont le tableau d'URL et dans mon « fetchedData: » méthode, je sauvegarde les données JSON renvoyés dans un fichier plist. Le problème est que pour tout nombre de fois que la boucle s'exécute, les données sont renvoyées pour seulement une/deux URL particulières (c'est-à-dire pour les URL aux index 1 et 3, ou 1 et 2, etc.). Je me connecte et constate que les URL sont différentes à chaque fois que la variable 'data' est initialisée.

Quelle est la meilleure façon de le faire? J'ai utilisé NSJSONSerialization pour analyser JSON.

Répondre

2

Il existe de bien meilleures façons de le faire. Le problème avec ce que vous essayez de faire est qu'il est synchrone, ce qui signifie que votre application devra attendre que cette action soit terminée avant de pouvoir faire quoi que ce soit d'autre. Je recommanderais certainement en regardant dans faire un appel asynchrone en utilisant simplement NSURLConnection et NSURLRequests, et en mettant en place des délégués pour eux.

Ils sont relativement simples à configurer et à gérer, et rendront votre application plus fluide d'un million de fois.

Je vais poster quelques exemples de code pour le faire un peu plus tard une fois que je rentre à la maison.

MISE À JOUR

D'abord, votre classe qui appelle ces connexions devront être un délégué pour les connexions dans le fichier d'interface, donc quelque chose comme ça.

ViewController.h

@interface ViewController: UIViewController <NSURLConnectionDelegate, NSURLConnectionDataDelegate> { 
    NSMutableData *pageData; 
    NSURLConnection *pageConnection; 
} 

Ensuite, vous devrez créer/initialiser les variables nécessaires à la mise en œuvre vous

ViewController.m

-(void) viewDidLoad { 
     pageData = [[NSMutableData alloc] init]; 
     NSURLRequest *pageRequest= [[NSURLRequest alloc] initWithURL:pageURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:4]; 
     pageConnection = [[NSURLConnection alloc] initWithRequest:pageRequestdelegate:self]; 
} 

Ensuite, vous devez également les fonctions de délégué qui seront appelés comme les données sont ret ratissé. Bien sûr, cet exemple n'inclut qu'une URL en cours de chargement, mais vous pouvez en créer autant que vous le souhaitez. Vous devrez bien sûr garder une trace de tous les NSURLConnections nécessaires afin que vous sachiez où placer les données que vous avez reçues, ainsi que les actions à prendre en cas d'échec ou de connexion réussie, mais ce n'est pas difficile extension de ce que j'ai donné.

Si vous voyez des erreurs flagrantes ou quelque chose ne fonctionne pas, s'il vous plaît faites le moi savoir.

+0

Merci, ça marche pour moi! – mvb