我注意到我的应用程序连接到远程资源的方式比Web浏览器慢,或者cURL并决定进行一些挖掘。
我一直在使用NSURLSession sessionWithConfiguration:delegate:
来处理服务器响应,并决定尝试使用NSURLSession dataTaskWithRequest:completionHandler:
。测试方法如下:
-(void)connectWithDelegate:(NSString *)url
{
semaphore = dispatch_semaphore_create(0);
session = [NSURLSession sessionWithConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]
delegate: self
delegateQueue: nil];
NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: url]
cachePolicy: NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval: 60.0];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest: req];
[dataTask resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
- (void)connectWithCompletionHandler:(NSString *)url
{
semaphore = dispatch_semaphore_create(0);
session = [NSURLSession sharedSession];
NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: url]
cachePolicy: NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval: 60.0];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:req completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error){
if (!error)
dispatch_semaphore_signal(semaphore);
}];
[dataTask resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
使用一系列不同的网络条件重复运行这些测试,connectWithCompletionHandler:
方法始终优于connectWithDelegate:
。在慢速连接上,返回速度可快6倍。
可以找到完整的测试代码here。
在5Mb / s链路上运行此测试20次,延迟为50 ms,connectWithCompletionHandler:
平均连接时间为0.6秒,connectWithDelegate:
平均连接时间为2秒
这两种方法之间响应时间的差异是什么原因......?