Search code examples
iosobjective-cnsurl

How to download image?


Use this code for downloading image. But image doesn’t appear on display.

  NSURL *url = [NSURL URLWithString:
 @"http://upload.wikimedia.org/wikipedia/commons/7/7f/Williams_River-27527.jpg"];

NSURLSessionDownloadTask *downloadPhotoTask = [[NSURLSession sharedSession]
 downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
  _downloadedImage = [UIImage imageWithData:
    [NSData dataWithContentsOfURL:location]];
}];

// 4    
[downloadPhotoTask resume];

_downloadedImage = [UIImage imageNamed:@"Williams_River-27527.jpg"];
    [_book3 setBackgroundImage: _downloadedImage forState:UIControlStateNormal];
    [_scroller addSubview:_book3];

UPD

I update my code in my xcode project but it doesn’t work too… Why it code doesn’t work too in my Xcode project?

#import "ViewController.h"

@interface ViewController () <NSURLSessionDelegate, NSURLSessionDownloadDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];
    NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithURL:[NSURL URLWithString:@"http://cdn.tutsplus.com/mobile/uploads/2013/12/sample.jpg"]];
    [downloadTask resume];

}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
    NSData *data = [NSData dataWithContentsOfURL:location];

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.progressView setHidden:YES];
        [self.imageView setImage:[UIImage imageWithData:data]];
    });
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes {

}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    float progress = (double)totalBytesWritten / (double)totalBytesExpectedToWrite;

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.progressView setProgress:progress];
    });
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

Why it code doesn’t work too in my Xcode project?


Solution

  • If you want this to work as the code stands (not sure that it will) then you need to run the steps in this process:

    //1     
    NSURL *url = [NSURL URLWithString:
      @"http://upload.wikimedia.org/wikipedia/commons/7/7f/Williams_River-27527.jpg"];
    
    // 2    
    NSURLSessionDownloadTask *downloadPhotoTask = [[NSURLSession sharedSession]
     downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
        // 3 
        _downloadedImage = [UIImage imageWithData:
        [NSData dataWithContentsOfURL:location]];
    
        //5
        dispatch_async(dispatch_get_main_queue(), ^{
            [_book3 setBackgroundImage: _downloadedImage forState:UIControlStateNormal];
            [_scroller addSubview:_book3];
        });
    }];
    
    // 4    
    [downloadPhotoTask resume];