2010-09-01 2 views
6

Я хотел бы знать, как проще всего закончить выполнение кода в объектном проекте c, потому что я вызываю веб-сервис и получаю результаты, и вместо этого он извлекает результаты до того, как веб-служба закончил быть вызванным и заполненным.Ждите завершения кода

Любые предложения, пожалуйста?

Btw это мой вебсервис код:

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

и код, я использую, чтобы вызвать этот метод из другого класса:

images = [ws callWebService:api :data]; 

     images = [ws returnArray]; 

теперь проблема в том, что вторая линия выполняются до того, как первый закончен

+0

Как вы используете код для вызова указанного веб-сервиса? – BoltClock

+0

У меня есть класс для моего веб-сервиса, и я использую SOAP – Lilz

ответ

19

Вы делаете это легко, как показано ниже,

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

Я не понимаю, как я могу это использовать. – Lilz

+0

Выполняет ли это aFunc под дочерним потоком? – AechoLiu

+0

Нет вышеуказанного кода в основной теме. Вы можете подумать, что jos - это http-запрос (асинхронный). Вышеприведенный код очень полезен, когда вы ждете работы async. Для получения дополнительной информации см. Http://blog.sallarp.com/iphone-ipad-wait-for-asynchronous-nsrunloop-task-to-complete/ – alones

4

Вы можете использовать один из многих из Cocoa design patterns (Делегат, Уведомление и т. д.).

Например, вы можете вызвать метод и подождать, пока не получите ответ.

Похоже, что вы используете асинхронный запрос, и для этого случая вам нужно будет дождаться, когда один из методов делегата получит уведомление о завершении запроса (с ошибкой или успехом).

BTW, как выглядит ваш запрос? Не могли бы вы поделиться некоторым кодом, чтобы объяснить, как вы выполняете запрос, и когда и что вы хотите сделать?

Отредактировано после того, как код был вставлен:

Вы устанавливаете self в качестве делегата от запроса, и поэтому вы должны быть в состоянии обрабатывать ответы.

Посмотрите на NSURLConnection Class Reference. Вам нужно будет вызвать ваш парсер, когда запрос заканчивается на этих Митос, например:

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

Приветствия,

VFN

+0

, который не будет работать для меня, поскольку эти методы также являются частью этого класса, и они вызываются из основного класса – Lilz

+0

Почему это работает для всех, но не для вас? Эти методы вызывают, когда запрос заканчивается. На основе вашего кода или вы должны указать в качестве делегата класс, в котором вы вызываете свой метод. Сделайте что-то вроде: [ws callWebService: данные api: делегат данных: self]; и реализовать методы делегата в этом классе. – vfn

+0

Моя проблема в том, что у меня есть 2 класса: давайте скажем A и B. Теперь из A мне нужно позвонить images = [b callWebService: api: data]; images = [b returnArray]; где b является экземпляром B. Теперь у меня есть соединение: didReceiveResponse в B, но до того, как он попадет туда через первую строку кода, он перейдет ко второй строке кода – Lilz

Смежные вопросы