我正在尝试从我的服务器下载94KB的图像文件。我尝试了两种方法:使用NSURLSession dataTaskWithURL
和NSData 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。
如有疑问,请检查会话中的所有其他连接。
答案 0 :(得分:4)
您遇到了线程问题。 不在后台线程中运行该代码(NSURLSession代码)!在主线程上运行它。别担心,这不会阻止主线程; NSURLSession的重点是它以异步方式运行,因此您不必这样做。