2013-11-16 4 views
0

Мне нужно настроить 30-секундный тайм-аут в моем приложении, когда он пытается подключиться к веб-службе. Я пробовал cachePolicy: timeoutInterval, но это не имеет никакого эффекта. Мой код ниже:Установка времени ожидания запроса в nsmutablerequest ios

NSURL *url = [NSURL URLWithString:@"http://myservice.asmx"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]]; 

[request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
[request addValue:@"http://tempuri.org/GetVehiclesByPhone_ServiceCall_Proc" forHTTPHeaderField:@"SOAPAction"]; 
[request addValue:msgLength forHTTPHeaderField:@"Content-Length"]; 
[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]]; 

NSError *error; 
NSURLResponse *response; 

webData =[[NSMutableData alloc] init]; 
webData = (NSMutableData *) [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
+0

Я не вижу, что вы устанавливаете интервал тайм-аута в своем коде. –

ответ

0

Использование +[NSURLConnection sendAsynchronousRequest:queue:completionHandler:].

В принципе, +[NSURLConnection sendSynchronousRequest:returningResponse:error:] не подчиняется timeoutInterval, который передается в течение небольших интервалов, в то время как выполняются асинхронные запросы.

Если вы думаете о том, как все работает, это становится очевидным: синхронные запросы блокируются, и нет простого способа проверить сторожевой таймер на тайм-ауты - поток блокируется !. Асинхронные запросы не блокируют поток, поэтому он может проверять таймауты при каждом запуске runloop.

+0

Я не уверен, что это правда, в частности потому, что в документации указано, что «Синхронная загрузка построена поверх асинхронного кода загрузки, доступного классу». –

+0

есть способ, с помощью которого я могу установить делегат NSUrlConnection без полного изменения моего кода? –

+0

@HassanZaheer '+ [NSURLConnection sendAsynchronousRequest: queue: completionHandler:]' - наименее эффективный способ получить асинхронную загрузку. В качестве быстрого взлома вы можете переместить все под своим вызовом 'sendSynchronousRequest' в блок завершения асинхронизации. – zadr

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