使用 NSURLSession 缓慢下载照片
Posted
技术标签:
【中文标题】使用 NSURLSession 缓慢下载照片【英文标题】:Slow downloading of photos with NSURLSession 【发布时间】:2015-08-20 19:10:41 【问题描述】:我正在使用 NSURLSession API 向我的 Java servlet 询问上传到我的服务器上的一些照片。然后我在一些 UIImageView 中显示设备上的照片。问题是最终显示一张照片可能需要十秒钟,大约是 100 ko。不用说,这是不可接受的。这是我使用的代码:
@interface ViewPhotoViewController () <UIAlertViewDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (nonatomic) NSURLSession *session;
@end
- (void)viewDidLoad
[super viewDidLoad];
NSURLSessionConfiguration *config =
[NSURLSessionConfiguration defaultSessionConfiguration];
self.session = [NSURLSession sessionWithConfiguration:config
delegate:nil
delegateQueue:nil];
NSString *requestedURL=[NSString stringWithFormat:@"http://myurl.com/myservlet?filename=%@", self.filename];
NSURL *url = [NSURL URLWithString:requestedURL];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setHTTPShouldHandleCookies:NO];
[request setTimeoutInterval:30];
[request setHTTPMethod:@"GET"];
[request setURL:url];
//Maintenant on la lance
NSURLSessionDownloadTask *downloadTask = [self.session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error)
NSData *downloadedData = [NSData dataWithContentsOfURL:location
options:kNilOptions
error:nil];
NSLog(@"Done");
NSLog(@"Size: %lu", (unsigned long)downloadedData.length);
UIImage *image = [UIImage imageWithData:downloadedData];
if (image) self.imageView.image = image;
];
[downloadTask resume];
奇怪的是我很快就得到了“完成”和“大小”日志,但照片仍然在很多秒后出现。我的代码有什么问题?
【问题讨论】:
【参考方案1】:那是因为你的完成块没有在主线程上调用,这意味着你对self.imageView.image = image;
的调用不是在主线程上进行的。你真的很幸运它可以工作,所有与 UIKit 相关的工作都应该在主线程上完成。
所以用这个替换if (image) self.imageView.image = image;
:
if (image)
dispatch_async(dispatch_get_main_queue(), ^
self.imageView.image = image;
);
【讨论】:
以上是关于使用 NSURLSession 缓慢下载照片的主要内容,如果未能解决你的问题,请参考以下文章
NSURLSession.sharedSession().dataTaskWithRequest 运行缓慢
ios8:如何使用 NSURLSession 在后台上传 100 张照片?可用空间问题
Xcode 7.3:NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9802)