2015-08-19 4 views
-1

Вот мой код, как скачать изображение с URL-адреса и сохранить его в каталоге документов, используя AFNetworking.Как показать изображение в UIImageView из кеша, используя AFNetworking?

Теперь, мой вопрос: если изображение уже загружено с URL-адреса, тогда изображение загружается из кеша вместо его повторной загрузки. Я хочу сделать это, используя AFNetworking. Я знаю, что решение этой проблемы находится внутри #import "UIKit+AFNetworking/UIKit+AFNetworking.h"

Если у кого-нибудь есть идеи, как помочь, пожалуйста, помогите мне решить мою проблему.

#import "ViewController.h" 

#define URL @"https://upload.wikimedia.org/wikipedia/commons/e/ec/USA-NYC-American_Museum_of_Natural_History.JPG" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    self.progressBar.hidden = YES ; 
    self.lblProgressStatus.hidden = YES; 
} 

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

- (IBAction)Action:(UIButton *)sender 
{ 
    self.progressBar.hidden = NO ; 
    self.lblProgressStatus.hidden = NO ; 
    self.ActionDownload.enabled = NO ; 

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 

    NSURL *strURL = [NSURL URLWithString:URL]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:strURL]; 

    NSProgress *progress; 

    NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) 
     { 
       NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; 
       return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; 
     } 
     completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) 
     { 
       [self.progressBar setHidden:YES]; 
       self.lblProgressStatus.text = @"Download completed" ; 
       NSLog(@"File downloaded to: %@", filePath); 

       NSString * strTemp = [NSString stringWithFormat:@"%@", filePath]; 
       NSArray *components = [strTemp componentsSeparatedByString:@"/"]; 
       id obj = [components lastObject]; 
       NSLog(@"%@", obj); 

      NSString *docPath = [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0]; 
      NSString *strFilePath = [NSString stringWithFormat:@"%@/%@",docPath, obj]; 

      BOOL fileExists=[[NSFileManager defaultManager] fileExistsAtPath:strFilePath]; 

      if (!fileExists) 
      { 
       NSLog(@"File Not Found"); 
      } 
      else 
      { 
       UIImage * image = [UIImage imageWithContentsOfFile:strFilePath]; 
       self.imageView.image = image ; 
      } 
      [progress removeObserver:self forKeyPath:@"fractionCompleted" context:NULL]; 

     }]; 

    [self.progressBar setProgressWithDownloadProgressOfTask:downloadTask animated:YES]; 
    [downloadTask resume]; 

    [progress addObserver:self 
       forKeyPath:NSStringFromSelector(@selector(fractionCompleted))     options:NSKeyValueObservingOptionNew 
        context:NULL]; 

} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"fractionCompleted"]) 
    { 
     NSProgress *progress = (NSProgress *)object; 
     int temp = progress.fractionCompleted * 100 ; 
     // NSLog(@"%d", temp); 
     NSString * strTemp = @"%"; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Update the UI 
      self.lblProgressStatus.text = [NSString stringWithFormat:@"%d %@", temp, strTemp]; 
     }); 
    } 
    else 
    { 
     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    } 
} 

@end 

ответ

2

Вы можете загрузить изображение, используя этот метод, определенный в UIImageView+AFNetworking:

[imageView setImageWithURL:[NSURL URLWithString:URL] placeholderImage:[UIImage imageNamed:@"placeholder-avatar"] success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 
    if ([[extension lowercaseString] isEqualToString:@"png"]) { 
     [UIImagePNGRepresentation(image) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]] options:NSAtomicWrite error:nil]; 
    } else if ([[extension lowercaseString] isEqualToString:@"jpg"] || [[extension lowercaseString] isEqualToString:@"jpeg"]) { 
     [UIImageJPEGRepresentation(image, 1.0) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]] options:NSAtomicWrite error:nil]; 
    } 
} failure:NULL]; 

Блок успех будет называться даже если он получает изображение из кеша. Надеюсь, это помогло!

+0

извините, но я не получаю ответа. –

+0

Вы хотите загрузить изображение (либо из кеша, либо из URL-адреса) и сохранить его локально? Или я вас неправильно понял? Вы можете использовать UIImageView + AFNetworking.h? – aramusss

+0

В приведенном выше коде мое изображение сохраняется в каталоге документов, теперь, когда оно загружается, оно извлекает изображение из кеша, а не собирается загружать его. и я хочу сделать это с помощью #import "UIKit + AFNetworking/UIKit + AFNetworking.h" –

1

По умолчанию используется кеш. Чтобы проверить, перейдите к URL-адресу, к которому у вас есть доступ к изображению, затем удалите изображение и загрузите его снова, и вы увидите, что он кэширован: D Иногда изображения не кэшируются, если они являются большими изображениями.

Если вы хотите, чтобы увеличить этот размер кэша, это в вашем приложении делегат:

[[NSURLCache sharedURLCache] setMemoryCapacity:(20*1024*1024)]; 
[[NSURLCache sharedURLCache] setDiskCapacity:(200*1024*1024)]; 

EDIT RE: Комментарии:

Если вы хотите, чтобы только загружать изображения, как только в путь документов , то, возможно, лучший способ проверить, существует ли изображение, которое должно быть загружено или нет, - это тест, который вы можете создать. Например, если последний компонент пути (последняя часть пути файла изображения) изображения уже существует в ваших документах, не загружайте его, а затем загружайте его.

EDIT: дальнейшие комментарии

Внутри UIKit + AFNetworking/UIImageView + AFNetworking.h

/** Асинхронный загружает изображение из указанного URL, и устанавливает его после того, как запрос будет закончен. Любой предыдущий запрос изображения для получателя будет отменен. Если изображение локализовано локально, изображение устанавливается сразу, в противном случае указанное изображение заполнителя будет установлено сразу, а затем удаленное изображение будет установлено после завершения запроса. По умолчанию URL-запросы имеют значение поля заголовка Accept «image/*», политику кэширования NSURLCacheStorageAllowed и интервал тайм-аута в 30 секунд и устанавливаются не обрабатывать файлы cookie. Чтобы настроить URL-запросы по-разному, используйте setImageWithURLRequest:placeholderImage:success:failure: @param url URL-адрес, используемый для запроса изображения. */

- (void)setImageWithURL:(NSURL *)url; 

Это выглядит точно так же, как то, что вы ищете

использовать:

#import <AFNetworking/UIKit+AFNetworking.h> 

и использовать

NSURL *strURL = [NSURL URLWithString:@"http://www.example.com/image.jpg"]; 
[imageview setImageWithURL:strURL]; 
+0

Я думаю, что вы не получаете мой вопрос, этот код загружает изображение при каждом запуске моего приложения. Я хочу, чтобы, если изображение уже находится в каталоге документа, оно должно быть загружено из документа, а не повторно загружено. –

+0

oh ok, извините: D я думал, что вы подразумеваете буквально кеш, это не кеш, который вы говорите о – Ben

+0

обновленный ответ Aarti, но кеш - это не то, что вы описали выше – Ben

0

Я рекомендую вам использовать эта библиотека https://github.com/rs/SDWebImage

Таким образом, вы можете сделать что-то вроде этого:

- (void)loadImage:(NSURL *)url 
{ 
    __block UIImage *image = [[SDImageCache sharedImageCache] queryDiskCacheForKey:[url absoluteString]]; 

    if(!image) { 

     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
     [request setTimeoutInterval: 30.0]; // Will timeout after 30 seconds 
     [NSURLConnection sendAsynchronousRequest:request 
              queue:[NSOperationQueue currentQueue] 
           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

            if (data != nil && error == nil) { 

             image = [UIImage imageWithData:data]; 

             NSData *pngData = UIImagePNGRepresentation(image); 
             [[SDImageCache sharedImageCache] storeImage:image imageData:pngData forKey:[url absoluteString] toDisk:YES]; 
            } 
            else { 
             // There was an error, alert the user 
             NSLog(@"%s Error: %@", __func__, error); 
            } 
           }]; 
    } 
} 
+0

Извините, но я хочу использовать #import «UIKit + AFNetworking/UIKit + AFNetworking.h» –

Смежные вопросы