У меня есть код, который отправляет соединение HTTP POST
. Я хочу, чтобы метод дождался ответа от сервера, чтобы он продолжался. Причина, по которой я это делаю, заключается в том, что я интегрирую новый код (асинхронный пост против старого синхронного поста) в наше приложение и ищу минимальные изменения во всем приложении.
Старый метод был следующим:
-(NSData*) postData: (NSString*) strData;
Приложение вызывает его и отправляет объект strData
и блокирует основной поток, пока не получит что-то обратно. Это было неэффективно, но работало хорошо, но из-за ограничений по тайм-ауту я должен изменить его
Итак, мой новый метод (опубликовать полный метод здесь) выглядит следующим образом:
-(NSData*) postData: (NSString*) strData
{
//start http request code
//postString is the STRING TO BE POSTED
NSString *postString;
//this is the string to send
postString = @"data=";
postString = [postString stringByAppendingString:strData];
NSURL *url = [NSURL URLWithString:@"MYSERVERURL"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:@"%d", [postString length]];
//setting prarameters of the POST connection
[request setHTTPMethod:@"POST"];
[request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request addValue:msgLength forHTTPHeaderField:@"Content-Length"];
[request addValue:@"en-US" forHTTPHeaderField:@"Content-Language"];
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
[request setTimeoutInterval:20]; //one second for testing purposes
NSLog(@"%@",postString);
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];
//end http request code
return receivedData; //this is set by a delegate somewhere else in the code
}
Он отправляет код нормально, но, конечно, (и, как и ожидалось), он не получает его достаточно быстро, чтобы его можно было правильно вернуть.
Что вы посоветуете мне сделать, чтобы «остановить» этот метод, чтобы ждать, пока что-нибудь вернется, пока что-то не будет получено? Я попытался установить цикл while, который ожидал на BOOL
, который будет установлен на YES
, когда все данные были получены, но этот цикл вообще не позволил отправлять код. Я также попытался перебросить содержимое этого метода в другой метод и вызвать его performSelectorInBackground
, но, конечно, это тоже не сработало. У меня заканчиваются идеи, и я очень ценю помощь.