Ждите NSURLConnection - PullRequest
       3

Ждите NSURLConnection

0 голосов
/ 27 сентября 2011

У меня есть код, который отправляет соединение 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, но, конечно, это тоже не сработало. У меня заканчиваются идеи, и я очень ценю помощь.

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Выполнение любых видов синхронных коммуникаций в главном потоке - плохая идея, но если вы не можете изменить архитектуру на этом этапе, взгляните на:

+ [NSURLConnection sendSynchronousRequest: returningResponse: error:]

Документацию можно найти здесь . Из обсуждения:

Синхронная нагрузка строится поверх кода асинхронной загрузки. сделанный доступным классом. Вызывающий поток блокируется, пока Система асинхронной загрузки выполняет загрузку URL в порожденном потоке специально для этого запроса загрузки. Нет специальных потоков или цикла выполнения Конфигурация необходима в вызывающем потоке, чтобы выполнить синхронная нагрузка.

А если серьезно, посмотрите, сколько работы потребуется для асинхронного выполнения запроса и получения уведомления по завершении запроса. Весь пользовательский опыт будет намного лучше.

0 голосов
/ 27 сентября 2011

Вы фактически выполняете асинхронный запрос там.

Чтобы сделать синхронный запрос, вы должны использовать + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error в классе NSURLConnection.

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

Приветствия

...