一旦我向服务器发送请求(通过NSURLConnection
sendSynchronousRequest
方法),服务器在大约2秒内收到请求,它会在另外3-5秒内处理并发回响应。但是,我只能在30-35秒内收到回复。这种延迟使我们的沟通非常缓慢。
即使异步API也会收到延迟响应。
早些时候,一切正常,客户在10秒内收到回复。 还有谁有相同的问题吗?可能是什么原因?
修改
这是Wireshark
分析的屏幕截图:
Link更好的形象
我应该如何看待什么数据包说什么?..为什么会延迟?
EDIT2 这是代码:
NSHTTPURLResponse *response=nil;
NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:nsURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:180.0];
[theRequest setHTTPMethod:@"POST"];
[theRequest setTimeoutInterval:180.0];
[theRequest setHTTPBody:[[NSString stringWithFormat:@"%@",sdata] dataUsingEncoding:NSASCIIStringEncoding]];
NSError *error= nil;
NSData *result = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&response error:&error];
if (error ) {
NSLog(@"error sending synchronous request: %@", error);
}
NSLog(@"request completed with code:%d",response.statusCode);
答案 0 :(得分:8)
我会避免打电话给sendSynchronousRequest
。如果您没有在后台线程上进行调用(您不想阻止UI线程),请使用异步版本。
您如何知道何时收到iOS回复?一个NSLog? UI状态更改?
另见这些问题:
NSURLConnection sendSynchronousRequest - background to foreground
NSURLConnection sendSynchronousRequest taking too much time to respond
<强>更新强>
如果您有点卡住,一种策略可能是排除使用NSURLConnection
作为问题。
NSURL
的异步连接调用而非同步如果您想仔细查看HTTP连接的内容,可以使用Charles,Fiddler或Wireshark等工具来调试正在进行的数据发送和接收。要从这种分析中获得最大收益,您需要具备一些HTTP协议的知识。这可能比前面提到的策略更耗时。
另请参阅How to monitor network calls made from iOS Simulator等问题。
<强>更新强>
您是在访问自己的网络服务器,还是其他人的网络服务器?
您是否仔细查看了发送到您的网络服务器的标头(以及返回的标头)?例如,注意内容长度。错误的内容长度可能会导致延迟,如here所述。
要查看请求和返回的标题,您可以在命令行上使用Firebug或类似wget或curl的内容。
另外,请仔细检查您网址末尾是否有换行符,如here所述。
答案 1 :(得分:4)
解决方案对我有用:
在请求标头中,iOS默认为“Accept-Encoding”设置“gzip”。 gzip压缩需要花费大量时间,因此延迟响应。我做了以下事情来解决问题:
[theRequest setValue:@"" forHTTPHeaderField:@"Accept-Encoding"];
注意:检查标题,了解任何响应延迟。
感谢@occulus将我引导至请求标题!
答案 2 :(得分:0)
你通过wifi或celluar做到这一点?
根据我的经验,当我的数据使用被删除时,我的电话提供商减慢了我的下载速度。在我使用大量移动数据后,有时这种情况发生在我月底。
答案 3 :(得分:0)
我不肯说但是可能是网络问题首先检查一下。它适当还是下降?好吧也许我会错的......但首先检查一下......
按照描述代码可能会解决您的问题:)
NSString *url = @"Your URL ";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
[request setHTTPMethod:@"POST"];
NSMutableData *body = [NSMutableData data];
.
.
/// Add Here Your NSMutableData Valuew
.
.
[request setHTTPBody:body];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (theConnection)
{
self.responseData = [[NSMutableData alloc] init];
}
else
NSLog(@"Connection Failed!");
答案 4 :(得分:-1)
为了减轻异步HTTP请求的问题,您应该考虑使用AFNetworking框架