2010-09-01 9 views
6

Me gustaría saber la manera más fácil de esperar a que el código finalice la ejecución dentro de un proyecto objetivo c porque estoy llamando a un servicio web y recuperando los resultados y en su lugar está recuperando los resultados antes de que el servicio web terminó siendo llamado y llenado.Espere a que el código finalice la ejecución

¿Alguna sugerencia por favor?

Por cierto este es mi código de servicio web:

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]; 

y el código que estoy utilizando para llamar a este método de la otra clase:

images = [ws callWebService:api :data]; 

     images = [ws returnArray]; 

Ahora el problema es, que la segunda línea es ejecutándose antes de que el primero haya terminado

+0

Cómo ¿Estás usando el código para llamar a dicho servicio web? – BoltClock

+0

Tengo una clase para mi servicio web y uso SOAP – Lilz

Respuesta

19

Usted lo hace fácilmente como abajo,

-(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

No entiendo cómo puedo usar esto. – Lilz

+0

¿Funciona aFunc bajo un hilo secundario? – AechoLiu

+0

No el código anterior está en el hilo principal. Puede pensar que A jos es el solicitante http (asincrónico). El código anterior es muy útil cuando espera la tarea asincrónica. Para obtener más información, consulte http://blog.sallarp.com/iphone-ipad-wait-for-asynchronous-nsrunloop-task-to-complete/ – alones

4

Puede usar uno de muchos Cocoa design patterns (Delegado, Notificación, etc.).

Por ejemplo, activaría el método y esperaría hasta recibir una respuesta.

Parece que está utilizando una solicitud asincrónica y, en este caso, deberá esperar hasta que uno de los métodos de delegado reciba una notificación de que la solicitud ha finalizado (con error o éxito).

Por cierto, ¿cómo se ve su pedido? ¿Podría compartir algún código para explicar cómo hace la solicitud y cuándo y qué desea hacer?

editar después se insertó el código:

configura self como el delegado de la solicitud, y por lo que debe ser capaz de manejar las respuestas.

Eche un vistazo a NSURLConnection Class Reference. Usted tendrá que activar el analizador cuando la solicitud termina en estos methos, por ejemplo:

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

Cheers,

VFN

+0

que no funcionará para mí ya que estos métodos también son parte de esa clase y se llaman desde la clase principal – Lilz

+0

¿Por qué funciona para todos pero no para usted? Estos métodos se invocan cuando finaliza la solicitud. En función de tu código o debes establecer como delegado la clase a la que llamas tu método. Haga algo como: [ws callWebService: api data: data delegate: self]; e implementa los métodos de delegado en esta clase. – vfn

+0

Mi problema es que tengo 2 clases: digamos A y B. Ahora desde A Necesito llamar al images = [b callWebService: api: data]; images = [b returnArray]; donde b es una instancia de B. Ahora tengo la conexión: didReceiveResponse en B pero antes de que llegue a través de la primera línea de código, va a la segunda línea del código – Lilz

Cuestiones relacionadas