4

一旦我向服务器发送请求(通过NSURLConnection sendSynchronousRequest方法),服务器会在大约 2 秒内收到它,它会在另外 3-5 秒内处理并发送回响应。但是,我只能在 30-35 秒内得到回复。这种延迟使我们的沟通非常缓慢。

甚至异步 API 也得到了延迟响应。

早些时候,一切正常,客户端在 10 秒内得到响应。还有谁有相同的问题吗?可能是什么原因?

编辑 这里是Wireshark分析的截图:

链接到更好的图像

在此处输入图像描述

我应该如何查看哪个数据包在说什么?...为什么会延迟?

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);
4

5 回答 5

8

我会避免打电话sendSynchronousRequest。如果您尚未在后台线程上进行调用(您不想阻塞 UI 线程),请改用异步版本。

您如何知道何时收到 iOS 响应?一个NSLog?UI 状态变化?

另请参阅以下问题:

NSURLConnection sendSynchronousRequest - 背景到前台

NSURLConnection sendSynchronousRequest 响应时间过长

更新

如果您有点卡住,一种策略可能是排除使用NSURLConnection作为问题。

  • 策略一:尝试使用NSURL's 的异步连接调用而不是同步
  • 策略 2:尝试使用不同的 HTTP 库,例如AFNetworking

如果您想仔细查看 HTTP 连接发生了什么,您可以使用CharlesFiddlerWireshark等工具来调试正在发送和接收的数据。要从此类分析中获得最大收益,您需要对 HTTP 协议有一定的了解。这可能比前面提到的策略更耗时。

另请参阅如何监控从 iOS 模拟器进行的网络调用等问题。

更新

您是在访问自己的网络服务器,还是其他人的网络服务器?

您是否仔细查看了发送到您的网络服务器的标头(以及返回的标头)?例如,注意内容长度。如此处所述,错误的内容长度可能会导致延迟。

要查看请求和返回的标头,您可以在命令行上使用 Firebug 或 wget 或 curl 之类的东西。

此外,请仔细检查您的 URL 末尾是否没有换行符,如此处所述

于 2013-01-18T11:40:29.830 回答
4

对我有用的解决方案

在请求标头中,iOS 默认为“Accept-Encoding”设置“gzip”。gzip 压缩花费了很多时间,因此延迟了响应。我做了以下事情来解决这个问题:

[theRequest setValue:@"" forHTTPHeaderField:@"Accept-Encoding"];

注意:检查您的标题,是否有任何响应延迟。

感谢@occulus 将我引导至请求标头!

于 2013-01-29T09:04:15.633 回答
0

你是通过 wifi 还是 celluar 做到这一点的?

根据我的经验,当我的数据使用量用尽时,我的电话提供商会减慢我的下载速度。有时在我使用大量移动数据后,这种情况会在月底发生在我身上。

于 2013-01-18T11:40:54.697 回答
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!");
于 2013-01-28T10:06:15.433 回答
-1

为了缓解异步 HTTP 请求的问题,您应该考虑使用 AFNetworking 框架

于 2013-01-29T12:53:20.053 回答