2010-09-01 15 views
6

Chciałbym poznać najłatwiejszy sposób oczekiwania na zakończenie kodu w ramach obiektywnego projektu c, ponieważ wywołuję serwis internetowy i pobieraję wyniki, a zamiast tego uzyskuję wyniki zanim serwis internetowy skończyłem dzwonienie i wypełnianie.Poczekaj na zakończenie kodu egzekucyjnego

Wszelkie sugestie proszę?

Btw jest to mój kod 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]; 

a kod używam do wywołania tej metody z innej klasy:

images = [ws callWebService:api :data]; 

     images = [ws returnArray]; 

teraz problem jest, że druga linia jest wykonywane przed pierwszym zakończeniem

+0

Jak czy obecnie używasz kodu do wywoływania wspomnianej usługi internetowej? – BoltClock

+0

Mam klasę dla mojej usługi internetowej i używam SOAP – Lilz

Odpowiedz

19

to zrobić łatwo, jak poniżej,

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

Nie rozumiem, jak mogę tego użyć. – Lilz

+0

Czy ten program uruchamiany jest pod wątkiem podrzędnym? – AechoLiu

+0

Żaden z powyższych kodów nie znajduje się w głównym wątku. Możesz myśleć, że jos jest requesterem http (asynchronicznym ..) Powyższy kod jest bardzo przydatny podczas oczekiwania na zadanie asynchroniczne. Aby uzyskać więcej szczegółów, proszę zobaczyć http://blog.sallarp.com/iphone-ipad-wait-for-asynchronous-nsrunloop-task-to-complete/ – alones

4

Możesz użyć jednego z wielu spośród Cocoa design patterns (Delegat, powiadomienie itp.).

Na przykład można uruchomić metodę i poczekać, aż otrzymasz odpowiedź z powrotem.

Wygląda na to, że używasz asynchronicznego żądania i w tym przypadku musisz poczekać, aż jedna z metod delegatów otrzyma powiadomienie, że żądanie zostało zakończone (z błędem lub sukcesem).

BTW, jak wygląda twoja prośba? Czy możesz udostępnić kod, aby wyjaśnić, w jaki sposób wykonujesz tę prośbę, kiedy i co chcesz robić?

Zmieniano po wstawiono kod:

ustawić self jako delegat żądaniu, a więc powinien być w stanie obsłużyć odpowiedzi.

Spójrz na NSURLConnection Class Reference. Będziesz potrzebował do uruchomienia parsera gdy żądanie zakończy się na tych Methos, na przykład:

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

Cheers,

VFN

+0

, która nie zadziała dla mnie, ponieważ te metody są również częścią tej klasy i są wywoływane z głównej klasy – Lilz

+0

Dlaczego to działa dla wszystkich, ale nie dla ciebie? Te metody są wywoływane po zakończeniu żądania. Na podstawie Twojego kodu lub powinieneś ustawić jako delegata klasę, w której nazywasz swoją metodę. Zrób coś takiego: [ws callWebService: dane api: delegat danych: self]; i implementuj metody delegatów na tej klasie. – vfn

+0

Mój problem polega na tym, że mam 2 klasy: powiedzmy A i B. Teraz od A muszę zadzwonić images = [b callWebService: api: data]; images = [b returnArray]; gdzie b jest instancją B. Teraz mam połączenie: didReceiveResponse w B, ale zanim dotrze tam przez pierwszą linię kodu, przechodzi do drugiej linii kodu – Lilz

Powiązane problemy