форсирование тайм-аута NSUrlConnection при синхронном вызове - PullRequest
1 голос
/ 02 марта 2011

Мне известны обсуждения, касающиеся nsurlconnection на ios, и что для тайм-аута требуется минимум 240 секунд.У меня вопрос, если я отправляю синхронный вызов через NSURLConnection + (NSData *) sendSynchronousRequest: (NSURLRequest ) запрос returningResponse: (NSURLResponse *) ошибка ответа: (NSError **) ошибка, есть ли шансЯ могу отменить это до истечения 240 секунд?Я думаю, возможно, установка таймера для отмены этого синхронного запроса, но я даже не уверен, возможно ли это вообще?Я думаю:

[self performSelector:@selector(cancelRequest:) withObject:myRequest afterDelay:myTimeOut];

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

Ответы [ 3 ]

6 голосов
/ 10 января 2013

Мне показалось, что это работает:

NSURL *url = [NSURL URLWithString:@"http://someurl.com"];
NSURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:5];
NSHTTPURLResponse *response = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];
if (response == nil) {
    // timed out or failed
} else {
    // all good
}

Конечно, установка интервала тайм-аута на то, как долго вы хотите, чтобы он блокировал основной поток до истечения времени ожидания - вышеуказанный код успешно истек через 5 секунд

Протестировано в iOS6 и iOS5.1

6 голосов
/ 02 марта 2011

Вы не можете отменить это.Просто не используйте его и используйте вместо этого асинхронный вызов.Те, которые вы можете легко отменить.

1 голос
/ 19 июля 2013
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url    cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0];

webData = (NSMutableData *)[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];

if (webData==nil) {
        [self displayAlert:@"Time Out" message:@"Request Timed Out"];
    }

Время ожидания ровно 10 секунд.

...