2016-07-16 10 views
2

Используйте этот код для загрузки. Но изображение не отображается на дисплее.Как скачать изображение?

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

я обновить свой код в моем проекте Xcode, но он не работает слишком ... Почему код не работает тоже в моей Xcode проекта?

#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. 
} 

Почему этот код не работает в моем проекте Xcode?

+0

Прежде всего, вы пытаетесь загрузить только что загруженное изображение 'UIImage' (то есть в память), как если бы оно было в вашем комплекте. Во-вторых, вы пытаетесь загрузить изображение, прежде чем он будет загружен асинхронно ... – Putz1103

ответ

0

Если вы хотите, чтобы работать, как код стоит (не уверен, что это будет), то вам необходимо выполнить действия, описанные в этом процессе:

//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]; 
0

Вы создаете первый экземпляр изображения по загрузив ее из вашего комплекта: _downloadedImage = [UIImage imageNamed:@"Williams_River-27527.jpg"]; (надеюсь, есть один)

После загрузки изображения из URL вы создаете второй экземпляр изображения с загруженным контентом. Но ваша кнопка по-прежнему привязывается к первому экземпляру (сильная ссылка). Кнопка просто не знает нового изображения.

Так что, если вы хотите изменить отображаемое изображение, которое вы должны установить его снова сразу же после назначения его _downloadedImage: [_book3 setBackgroundImage: _downloadedImage forState:UIControlStateNormal];

Может быть, вам нужно обновить пользовательский интерфейс после этого.