2010-09-01 7 views
6

Je souhaiterais connaître le moyen le plus simple d'attendre l'exécution du code dans un projet c objectif, car j'appelle un service Web et récupère les résultats, mais récupère les résultats avant que le service Web fini d'être appelé et rempli.Attendre la fin de l'exécution du code

Des suggestions s'il vous plaît?

BTW ceci est mon code webservice:

NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:tmpURl]; 

[theRequest addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 

[theRequest addValue:@"http://tempuri.org/GetCategory" forHTTPHeaderField:@"SOAPAction"]; 

NSString *msgLength=[NSString stringWithFormat:@"%i",[soapMessage length]]; 

[theRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"]; 

[theRequest setHTTPMethod:@"POST"]; 

[theRequest setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]]; 

NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

et le code j'utilise pour appeler cette méthode de l'autre classe:

images = [ws callWebService:api :data]; 

     images = [ws returnArray]; 

le problème est maintenant que la deuxième ligne est en cours d'exécution avant la fin du premier

+0

Comment utilisez-vous actuellement du code pour appeler le service Web? – BoltClock

+0

J'ai un cours pour mon webservice et j'utilise SOAP – Lilz

Répondre

19

vous le faites facilement comme ci-dessous,

-(void)aFunc { 

Do Asynchronous A job... 

while (A is not finished) { 
// If A job is finished, a flag should be set. and the flag can be a exit condition of this while loop 

// This executes another run loop. 
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 

} 

Do things using the A's result. 

} 
+0

Je ne comprends pas comment je peux utiliser ceci. – Lilz

+0

Est-ce que aFunc s'exécute sous un thread enfant? – AechoLiu

+0

Non le code ci-dessus est dans le fil principal. Vous pouvez penser A jos est le demandeur HTTP (asynchrone ..) Le code ci-dessus est très utile lorsque vous attendez un travail asynchrone. Pour plus de détails, s'il vous plaît voir http://blog.sallarp.com/iphone-ipad-wait-for-asynchronous-nsrunloop-task-to-complete/ – alones

4

Vous pouvez utiliser l'un des nombreux Cocoa design patterns (délégué, notification, etc.). Par exemple, vous déclenchez la méthode et attendez que vous receviez une réponse.

Il semble que vous utilisiez une requête asynchrone et dans ce cas, vous devez attendre jusqu'à ce que l'une des méthodes de délégation soit avertie que la requête est terminée (avec erreur ou succès).

BTW, à quoi ressemble votre demande? Pourriez-vous partager du code pour expliquer comment vous faites la demande et quand et ce que vous voulez faire?

Edité après le code a été inséré:

Vous définissez self en tant que délégué de la demande, et donc vous devriez être en mesure de gérer les réponses.

Jetez un oeil à la NSURLConnection Class Reference. Vous aurez besoin de déclencher votre analyseur lorsque la demande se termine sur ces methos, par exemple:

– connection:didReceiveResponse: 
– connection:didReceiveData: 
– connection:didFailWithError: 

Cheers,

VFN

+0

qui ne fonctionnera pas pour moi puisque ces méthodes font aussi partie de cette classe et qu'elles sont appelées depuis la classe principale – Lilz

+0

Pourquoi ça marche pour tout le monde mais pas pour vous? Ces méthodes sont appelées lorsque la requête se termine. Basé sur votre code ou vous devez définir en tant que délégué la classe où vous appelez votre méthode. Faites quelque chose comme: [ws callWebService: données api: data delegate: self]; et implémenter les méthodes de délégué sur cette classe. – vfn

+0

Mon problème est que j'ai 2 classes: disons A et B. Maintenant de A je dois appeler images = [b callWebService: api: data]; images = [b returnArray]; où b est une instance de B. Maintenant, j'ai la connexion: didReceiveResponse dans B mais avant qu'il y arrive à travers la première ligne de code, il va à la deuxième ligne de code – Lilz

Questions connexes