Подождите, пока код завершит выполнение - PullRequest
6 голосов
/ 01 сентября 2010

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

Есть предложения, пожалуйста?

Кстати, это мой код веб-сервиса:

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

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

Ответы [ 2 ]

20 голосов
/ 01 сентября 2010

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

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

}
4 голосов
/ 01 сентября 2010

Вы можете использовать один из многих шаблонов проектирования Какао (Делегат, Уведомление и т. Д.).

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

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

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

Отредактировано после вставки кода:

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

Посмотрите на Ссылку класса NSURLConnection .Вам нужно будет запустить ваш синтаксический анализатор, когда запрос завершится по следующим методам, например:

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

Cheers,

vfn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...