Время ожидания NSMutableURLRequest истекло примерно через 15 секунд. Время ожидания установлено на 240 секунд.

Я работаю над приложением для iOS, которое использует NSMutableURLRequest и NSURLConnection для отправки данных на мой сервер. Мне нужно отображать сообщение об ошибке, когда оно терпит неудачу. Мой код для отправки запроса показан ниже

const int TIMEOUT = 120;

-(void)send:(id<NSURLConnectionDelegate>)delegate
{
    bodyContents = [bodyContents stringByAppendingFormat:@"--%@--",boundry];
    NSData *data = [bodyContents dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:data];
    [request setValue:[NSString stringWithFormat:@"%i",[data length]+4] forHTTPHeaderField:@"Content-Length"];
    NSLog(@"Timeout before setting custom is %f",request.timeoutInterval);
    [request setTimeoutInterval:TIMEOUT];
    NSLog(@"Timeout after setting custom is %f",request.timeoutInterval);
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:delegate];
    if(connection)
        NSLog(@"Connection good");
    else
        NSLog(@"Connection not so good");
}

//in the delegate class
-(void)connectionDidFinishLoading:(NSURLConnection*)connection
{
    NSLog(@"connectionDidFinishLoading");
}

-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError *)error
{
    NSLog(@"Failed with error %@",error);
    btnCancel.title = @"Retry";
    self.navigationItem.hidesBackButton = NO;
    [self showAlertDialog:[NSString stringWithFormat:@"%@",[error localizedDescription]] :@"Error"];
}

Я ожидаю, что сообщение didFailWithError будет вызвано через 2 минуты без ответа. Вместо этого он вызывается примерно через 15 секунд без ответа, что не имеет никакого смысла. Я просмотрел документацию, чтобы проверить, неправильно ли я устанавливаю время ожидания, единственное, что я смог найти, это то, что минимальное время ожидания для сообщения с телом составляет 240 секунд, что я неохотно принял.

Результат запуска приложения выглядит следующим образом:

2012-06-22 16:49:12.393 Загрузка мультимедиа[672:707] Тайм-аут перед настройкой пользовательского 240.000000

2012-06-22 16:49:12.394 Загрузка мультимедиа[672:707] Тайм-аут после установки пользовательского значения 240.000000

2012-06-22 16:49:12.395 Загрузка мультимедиа[672:707] Соединение хорошее

22-06-2012 16:49:29.174 Загрузка мультимедиа[672:707] Сбой с ошибкой Домен ошибки=NSURLErrorDomain Code=-1001 Время ожидания запроса истекло. и т.д

Я более чем немного смущен тем, почему время истекает так быстро. Сервер не работает, когда соединение создается, поэтому я даже не уверен, почему он говорит «Соединение хорошее», а не «соединение не очень хорошее», но это другая проблема (надеюсь). Есть предложения?


person nick    schedule 22.06.2012    source источник


Ответы (1)


Так что подозреваю, что ответ весь в семантике.

Что касается ведения журнала «Соединение хорошее» вместо «Соединение не очень хорошее», это связано с тем, что установка соединения не ждет, пока оно что-нибудь сделает в сети. Это действительно приводит к его немедленному запуску, но не раньше, чем он вернется из метода init.

Более интересная (читай: вводящая в заблуждение) проблема связана с тайм-аутом. Я подозреваю, что на самом деле настройка тайм-аута означает: «Если я установил соединение, но сервер еще не дал мне байты ответа». Что отличается от «Я пытался, но не могу подключиться». Это имеет определенный смысл, когда вы думаете об этом таким образом; Одно значение тайм-аута только для всего «сетевого» материала (маршрутизация и рукопожатия), а другое — для фактической обработки полезной нагрузки.

person Chris Trahey    schedule 23.06.2012
comment
Так что, чтобы быть уверенным, что я понимаю, по сути, 15-секундный тайм-аут связан с тем, что он не может изначально найти сервер, а 240-секундный тайм-аут - если я связался с сервером и отправил свой пакет, но он не отвечает в течение 240 секунд. затем тайм-аут. Это правильно? - person nick; 24.06.2012
comment
Это мое понимание, да. 240 секунд — это тайм-аут «подключения», который применяется после того, как у вас есть «подключение». - person Chris Trahey; 24.06.2012