使用NSURLSession缓慢下载照片

时间:2015-08-20 19:10:42

标签: ios servlets nsurlsessiondownloadtask

我正在使用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 个答案:

答案 0 :(得分:1)

这是因为你没有在主线程上调用完成块,这意味着你没有在主线程上调用self.imageView.image = image;。你真的很幸运,它的工作原理,所有与UIKit相关的工作都应该在主线上完成。

所以用这个替换if (image) self.imageView.image = image;

if (image) {
    dispatch_async(dispatch_get_main_queue(), ^{
        self.imageView.image = image;
    });
}