为什么NSURLSession dataTaskWithURL明显慢于NSData dataWithContentsOfURL?

时间:2015-05-12 02:49:47

标签: ios performance nsdata nsurlsession

我正在尝试从我的服务器下载94KB的图像文件。我尝试了两种方法:使用NSURLSession dataTaskWithURLNSData dataWithContentsOfURL

NSURLSession:

Globals *global = [Globals getInstance];

// GET request to /mobile/image
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/mobile/image/%@", [global rootUrl], self.photoId]];
NSURLSession * session = [global session];
NSDate *start = [NSDate date];
[[session dataTaskWithURL:url completionHandler:^(NSData *imgData, NSURLResponse *response, NSError *error) {
    NSLog(@"Time taken: %f", [[NSDate date] timeIntervalSinceDate:start]);
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
    if ([httpResponse statusCode] != 200) {
        // error
    } else {
        dispatch_async(dispatch_get_main_queue(), ^ {
            UIImage *image = [UIImage imageWithData:imgData];

            CGFloat width = self.photoImageView.frame.size.width;
            CGFloat height = image.size.height / image.size.width * width;
            self.imageHeight.constant = height;

            self.photoImageView.image = image;
        });
    }
}] resume];

NSData的:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ {
    Globals *global = [Globals getInstance];

    // GET request to /mobile/image
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/mobile/image/%@", [global rootUrl], self.photoId]];
    NSDate *start = [NSDate date];
    NSData *imgData = [NSData dataWithContentsOfURL:url];
    NSLog(@"Time taken: %f", [[NSDate date] timeIntervalSinceDate:start]);
    UIImage *image = [UIImage imageWithData:imgData];

    CGFloat width = self.photoImageView.frame.size.width;
    CGFloat height = image.size.height / image.size.width * width;

    dispatch_async(dispatch_get_main_queue(), ^{
        self.imageHeight.constant = height;
        self.photoImageView.image = image;
    });
});

以下是我的NSLog输出完成时间的输出:

NSURLSession:

Time taken: 6.585221
Time taken: 3.619189
Time taken: 4.408179
Time taken: 9.931350
Time taken: 3.689192

NSData的:

Time taken: 0.157747
Time taken: 0.135785
Time taken: 0.576947
Time taken: 0.462661
Time taken: 0.337266

花3到10秒下载一个简单的< 100KB图像文件是不可接受的,所以我现在只是坚持NSData,但我需要稍后使用NSURLSession进行另一个类似的图像下载任务因为我需要登录会话。

我想知道我是否偶然发现了NSURLSession的一个奇怪的错误,如果它应该慢得多,因为它有会话的所有开销,或者我做错了。< / p>

编辑:

我想通了,谢谢你的帮助!

我创建了一个包含此项目所有连接的全新项目,并且表现良好。

问题:之前的VC之前多次调用dataTask。我完全不知道为什么会影响这个VC。原来这个类叫做ViewController(默认名称),而这个VC继承了ViewController而不是UIViewController。

因此,从此ViewController的viewDidLoad调用[super viewDidLoad]实际上是调用前一个VC并重新运行所有这些dataTasks。

如有疑问,请检查会话中的所有其他连接。

1 个答案:

答案 0 :(得分:4)

您遇到了线程问题。 在后台线程中运行该代码(NSURLSession代码)!在主线程上运行它。别担心,这不会阻止主线程; NSURLSession的重点是以异步方式运行,因此您不必这样做。