我需要从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)
答案 0 :(得分:2)
看起来延迟是获取请求响应所用时间的主要因素。一个可能的原因可能是使用代理网络。另请注意,连接,SSL握手所花费的时间不仅仅是延迟,而且还有助于Duration 1.18 sec
。
答案 1 :(得分:0)
没有设置好[opQueue setMaxConcurrentOperationCount:8];
实际上,你有8个进程将同时启动。如果你没有设置它,你将拥有更多。
答案 2 :(得分:0)
AFHTTPRequestOperation
使用裸骨NSURLConnection
。我怀疑你可以做些什么来改善客户端的服务器响应时间。但是,在服务器端还有很多工作要做:
如果可能,只需将文件打包在一个档案中。
附加的响应标头指出服务器已停用对persistent HTTP connections的支持:
保持活着否
启用keep-alive可能是您可以做的最好的事情。对于https,禁用的持久连接为even worse,而不是http:
击败HTTP / 1.1的默认Keep-Alive行为对于常规HTTP连接来说是一种不好的做法,但它对于HTTPS连接来说要糟糕得多,因为HTTPS连接的初始设置成本远高于常规HTTP连接。浏览器不仅支付设置新TCP / IP连接的性能损失,包括握手和初始拥塞窗口大小调整,而且请求的进度也会受到完成用于保护连接的HTTPS握手所需时间的影响。
最后一件事是HTTP pipelining。确保检查您的服务器是否支持它。然后根据您的请求启用它:
NSMutableURLRequest *request = ...
request.HTTPShouldUsePipelining = YES;