AFNetworking并发Http请求

时间:2015-02-20 16:06:31

标签: objective-c performance cocoa connection httprequest

我需要从API下载大约200个文件。它们都只有大约15KB。 我目前的代码看起来像这样:

NSOperationQueue* opQueue = [[NSOperationQueue alloc]init];
[opQueue setMaxConcurrentOperationCount:8];

NSString* baseUrl = @"https://someapi.com/somejson.json?page=";

for(int n = 0; n <= numberOfPages; n++) {
    @autoreleasepool {

         NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%d", baseUrl, n]]cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:20];


        AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
        operation.responseSerializer = [AFJSONResponseSerializer serializer];

        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"Done");
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error");
        }];

        [opQueue addOperation:operation];

    }
};

虽然这样做很好,但我很好奇是否有更快的方法来做到这一点。目前下载文件大约需要20秒。由于它们都很小,我想花费最多时间的是等待服务器响应。有没有更好的排队方式,所以所有的连接都建立在&#34;相同的&#34;时间,还是那种硬帽?

我已经尝试过设置

[opQueue setMaxConcurrentOperationCount:8];

各种不同的值,以及根本不设置它们。但这似乎并没有真正提高绩效。

这是其中一个连接的Charles日志。其他几乎是相同的,但如果有必要,我可以发布更多。

URL https://<hidden>&page=0
Status  Complete
Response Code   200 OK
Protocol    HTTP/1.1
Method  GET
Kept Alive  No
Content-Type    application/json; charset=utf-8
Client Address  /127.0.0.1
Remote Address  <hidden>
Timing  
Request Start Time  24.02.15 09:49:58
Request End Time    24.02.15 09:49:58
Response Start Time 24.02.15 09:49:59
Response End Time   24.02.15 09:49:59
Duration    1.18 sec
DNS 1 ms
Connect 42 ms
SSL Handshake   127 ms
Request 0 ms
Response    1 ms
Latency 974 ms
Speed   8,36 KB/s
Response Speed  9.626,95 KB/s

Size    
Request Header  283 bytes
Response Header 552 bytes
Request -
Response    9,09 KB (9306 bytes)
Total   9,90 KB (10141 bytes)
Request Compression -
Response Compression    91,8% (gzip) 

3 个答案:

答案 0 :(得分:2)

看起来延迟是获取请求响应所用时间的主要因素。一个可能的原因可能是使用代理网络。另请注意,连接,SSL握手所花费的时间不仅仅是延迟,而且还有助于Duration 1.18 sec

答案 1 :(得分:0)

没有设置好[opQueue setMaxConcurrentOperationCount:8];

实际上,你有8个进程将同时启动。如果你没有设置它,你将拥有更多。

答案 2 :(得分:0)

AFHTTPRequestOperation使用裸骨NSURLConnection。我怀疑你可以做些什么来改善客户端的服务器响应时间。但是,在服务器端还有很多工作要做:

  1. 如果可能,只需将文件打包在一个档案中。

  2. 附加的响应标头指出服务器已停用对persistent HTTP connections的支持:

  3.   

    保持活着否

    启用keep-alive可能是您可以做的最好的事情。对于https,禁用的持久连接为even worse,而不是http:

      

    击败HTTP / 1.1的默认Keep-Alive行为对于常规HTTP连接来说是一种不好的做法,但它对于HTTPS连接来说要糟糕得多,因为HTTPS连接的初始设置成本远高于常规HTTP连接。浏览器不仅支付设置新TCP / IP连接的性能损失,包括握手和初始拥塞窗口大小调整,而且请求的进度也会受到完成用于保护连接的HTTPS握手所需时间的影响。

    1. 最后一件事是HTTP pipelining。确保检查您的服务器是否支持它。然后根据您的请求启用它:

      NSMutableURLRequest *request = ...
      request.HTTPShouldUsePipelining = YES;