NSURLConnection синхронная задача - PullRequest
0 голосов
/ 28 декабря 2010

Я пишу приложение для iPhone, которое будет вызывать метод веб-сервиса с использованием формата мыльного сообщения.Мне нужен синхронный процесс, потому что табличное представление нуждается в этих данных, прежде чем они могут быть отображены.Поэтому я использую [NSURLConnection sendSynchronousRequest: returningResponse: error:]

Проблема в том, что вся программа завершит работу без сообщения об ошибке после вызова метода.Даже после того, как я поместил оператор NSLog сразу после [NSURLConnection sendSynchronousRequest: returningResponse: error:], никаких выходных данных нет, поэтому я уверен, что программа завершается во время вызова этого метода.На самом деле во время этого HTTP-запроса и ответа.

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

Кто-нибудь может понять, что происходит?Спасибо.

- (void) sendSyncHTTPRequest:(NSString *)request_data operation:(ServOperationSync *)serv_ops { 
id<ServiceData> serv_data = serv_ops.dataDelegate;
NSURL *urlAddr = [NSURL URLWithString:[serv_data getServURL]];

urlRequest = [NSMutableURLRequest requestWithURL:urlAddr
                                     cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                 timeoutInterval:90];
NSData *requestData = [request_data dataUsingEncoding:NSUTF8StringEncoding];
[urlRequest setValue:@"MobilePortal" forHTTPHeaderField:@"User-Agent"];
[urlRequest setValue:[serv_data getSoapAction] forHTTPHeaderField:@"SOAPAction"];
[urlRequest setValue:[NSString stringWithFormat:@"%u", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[urlRequest setValue:urlAddr.host forHTTPHeaderField:@"Host"];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:requestData];

NSLog(@"just before sending http request");
[serv_ops.responseData setData:[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&urlResponse error:&urlError]];
NSLog(@"after sending http request");

}

Обратите внимание, что urlResponse и urlError объявлены как переменные экземпляра.

Ответы [ 2 ]

3 голосов
/ 28 декабря 2010

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

Использование [NSURLConnection sendSynchronousRequest:returningResponse:error:] обычно плохая идея, потому что оно блокирует текущий поток. Вы, вероятно, вызываете его из основного потока, это заблокирует пользовательский интерфейс. Приложение не реагирует на прикосновения и выглядит как замороженное, когда запрос занимает много времени (особенно при подключении с низкой пропускной способностью, таком как EDGE).

Природа сети асинхронная. Поэтому я бы посоветовал вам сделать вместо этого асинхронный запрос или использовать GCD . Обновите табличное представление в методах делегата (соединение: didReceiveData: и т. Д.). Вы можете сохранить данные таблицы в NSMutableArray и вызвать [tableView reloadData] после изменения массива. Затем таблица будет построена из этого массива в методах делегатов UITableViewDataSource.

0 голосов
/ 28 декабря 2010

Вам необходимо:

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