使用 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 用于循环中的多个请求

NSURLSession.sharedSession().dataTaskWithRequest 运行缓慢

ios8:如何使用 NSURLSession 在后台上传 100 张照片?可用空间问题

Xcode 7.3:NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9802)

UICollectionView 与从照片中获取的数据源 - 大量照片的缓慢更新

使用 NSURLSession 异步下载数据和处理