NSMutableURLRequest在大约15秒后超时。超时设置为240秒

时间:2012-06-22 22:58:23

标签: iphone ios ipad nsurlconnection nsmutableurlrequest

我正在使用一个使用NSMutableURLRequestNSURLConnection的iOS应用程序向我的服务器发送数据。我需要在失败时显示错误消息。我发送请求的代码如下所示

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"];
}

我希望在2分钟无响应后调用didFailWithError消息。相反,它在大约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 Media Upload [672:707] Connection good

     

2012-06-22 16:49:29.174 Media Upload [672:707]失败,错误错误Domain = NSURLErrorDomain Code = -1001“请求超时。”等

我对于为什么它如此迅速地超时感到困惑。创建连接时服务器没有启动,所以我甚至不确定为什么它说连接好而不是连接不太好,但这是一个不同的问题(我希望)有什么建议吗?

1 个答案:

答案 0 :(得分:2)

所以,我怀疑答案完全在于语义。

对于“连接良好”日志记录而不是“连接不太好”,这是因为初始化连接不等待它在网络上执行任何 会立即启动它,但不会在它从init方法返回之前启动。

更有趣(读:误导)问题是超时。我怀疑超时设置的真正含义是,“如果我已建立连接,但服务器还没有给我响应字节”。这与“我一直在尝试,但无法连接”截然不同。当你以这种方式想到它时,它会有一定的意义;一个超时值仅适用于所有“网络”内容(路由和握手),另一个超时值适用于要处理的实际有效负载。