2015-07-24 12 views
7

Moje wymogiem jest:Którą z zewnętrznych klas Imageview powinienem użyć?

  1. trzeba pokazać obraz w ImageView z serwera URL & zapisać do użytku w trybie offline również.
  2. Może jednak istnieć ryzyko, że ten sam obraz adresu URL może zostać zaktualizowany.

Próbowałem EGOImageview, AsyncImageview, FXImageview, Haneke thsese wszystkie klasy próbowałem. osiągnięto moją pierwszą część wymagania. ale nie drugie .. jeśli obraz linku "xxxxx" jest wyświetlany po raz pierwszy .... jeśli na tym samym obrazie linku jest zmniejszona, aplikacja pokazuje tylko stary obraz ...

+0

czy próbowałeś tego - [[NSURLCache sharedURLCache] removeAllCachedResponses]; – Nayan

+0

SDWebImage jest dobry, nigdy nie miał z tym problemów: https://github.com/rs/SDWebImage – Jasper

+0

@Jasper jest pewien co do SDWebImage, że spełni moje drugie wymaganie. – Kalyani

Odpowiedz

1

Powinieneś spojrzeć na SDWebImage. Jest to jedna z najczęściej używanych kategorii UIImageView już teraz i oferuje wiele funkcji, w tym buforowanie.

Zapraszamy do obejrzenia tej części dokumentacji, aby nauczyć się odświeżyć pamięć podręczną z nim: Handle image refresh

+0

próbowałem tego, ale wciąż moje drugie wymaganie nie zostało osiągnięte ... :(.. – Kalyani

3

Można użyć poniższego klasę, która będzie pełna wypełnić swoje wymagania

DImageView.h

#import <UIKit/UIKit.h> 
@interface DImageView : UIImageView 
@property (nonatomic, strong) UIActivityIndicatorView *activityView; 
- (void)processImageDataWithURLString:(NSString *)urlString; 
+ (UIImage *)getSavedImage :(NSString *)fileName; 
+ (void)saveImageWithFolderName:(NSString *)folderName AndFileName:(NSString *)fileName AndImage:(NSData *) imageData; 

DImageView.m

#import "DImageView.h" 
#define IMAGES_FOLDER_NAME @"DImages" 
@implementation DImageView 

#pragma mark - App Life Cycle 
- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
    } 
    return self; 
} 
- (void)dealloc 
{ 
    self.activityView = nil; 
    [super dealloc]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) 
    { 
     [self initWithFrame:[self frame]]; 
    } 
    return self; 
} 

#pragma mark - Download images 
- (void)processImageDataWithURLString:(NSString *)urlString //andBlock:(void (^)(UIImage * img))processImage 
{ 
    @autoreleasepool 
    { 
     UIImage * saveImg = [DImageView getSavedImage:urlString]; 
     if (saveImg) 
     { 
      dispatch_queue_t callerQueue = dispatch_get_main_queue(); 
      dispatch_async(callerQueue, ^{ 

       @autoreleasepool 
       { 
        [self setImage:saveImg]; 
       } 
      }); 
     } 
     else 
     { 
      [self showActivityIndicator]; 
      NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

      dispatch_queue_t callerQueue = dispatch_get_main_queue(); 
      dispatch_queue_t downloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0); 
      __block NSError* error = nil; 
      dispatch_async(downloadQueue, ^{ 


       NSData * imageData = [[[NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error] retain] autorelease]; 
       if (error) 
       { 
        NSLog(@"DImg Error %@", [error debugDescription]); 
       } 
       else 
       { 
        dispatch_async(callerQueue, ^{ 

         @autoreleasepool 
         { 
          UIImage *image = [UIImage imageWithData:imageData]; 
          [self setImage:image]; 
          [self hideActivityIndicator]; 
          /* Below code is to save image*/ 
          [DImageView saveImageWithFolderName:IMAGES_FOLDER_NAME AndFileName:urlString AndImage:imageData]; 
         } 
        }); 
       } 
      }); 
      dispatch_release(downloadQueue); 
     } 
    } 
} 

#pragma mark - File Save methods 

+ (void)saveImageWithFolderName:(NSString *)folderName AndFileName:(NSString *)fileName AndImage:(NSData *) imageData 
{ 
    @autoreleasepool 
    { 
     NSFileManager *fileManger = [NSFileManager defaultManager] ; 
     NSString *directoryPath = [NSString stringWithFormat:@"%@/%@",[DImageView applicationDocumentsDirectory],folderName] ; 

     if (![fileManger fileExistsAtPath:directoryPath]) 
     { 
      NSError *error = nil; 
      [fileManger createDirectoryAtPath:directoryPath withIntermediateDirectories:YES attributes:nil error:&error]; 
     } 

     fileName = [DImageView fileNameValidate:fileName]; 
     NSString *filePath = [NSString stringWithFormat:@"%@/%@",directoryPath,fileName] ; 

     BOOL isSaved = [imageData writeToFile:filePath atomically:YES]; 
     if (!isSaved) 
     { 
      NSLog(@" ** Img Not Saved"); 
     } 
    } 
} 

+ (NSString *)applicationDocumentsDirectory 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
    return basePath; 
} 

+ (UIImage *)getSavedImage :(NSString *)fileName 
{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    fileName = [DImageView fileNameValidate:fileName]; 

    NSFileManager * fileManger = [NSFileManager defaultManager] ; 
    NSString * directoryPath = [NSString stringWithFormat:@"%@/%@",[DImageView applicationDocumentsDirectory],IMAGES_FOLDER_NAME] ; 
    NSString * filePath = [NSString stringWithFormat:@"%@/%@",directoryPath,fileName] ; 

    if ([fileManger fileExistsAtPath:directoryPath]) 
    { 
     UIImage *image = [UIImage imageWithContentsOfFile:filePath] ; 
     if (image) 
     { 
      return image; 
     } 
     else 
     { 
      NSLog(@"** Img Not Found **"); 
      return nil; 
     } 
    } 
    [pool release]; 
    return nil; 
} 

+ (NSString*) fileNameValidate : (NSString*) name 
{ 
    name = [name stringByReplacingOccurrencesOfString:@"://" withString:@"##"]; 
    name = [name stringByReplacingOccurrencesOfString:@"/" withString:@"#"]; 
    name = [name stringByReplacingOccurrencesOfString:@"%20" withString:@""]; 
    return name; 
} 

#pragma mark - Activity Methods 

- (void) showActivityIndicator 
{ 
    self.activityView = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    self.activityView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; 
    self.activityView.hidesWhenStopped = TRUE; 
    self.activityView.backgroundColor = [UIColor clearColor]; 
    self.activityView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; 

    [self addSubview:self.activityView]; 
    [self.activityView startAnimating]; 
} 
- (void) hideActivityIndicator 
{ 
    CAAnimation *animation = [NSClassFromString(@"CATransition") animation]; 
    [animation setValue:@"kCATransitionFade" forKey:@"type"]; 
    animation.duration = 0.4;; 
    [self.layer addAnimation:animation forKey:nil]; 
    [self.activityView stopAnimating]; 
    [self.activityView removeFromSuperview]; 

    for (UIView * view in self.subviews) 
    { 
     if([view isKindOfClass:[UIActivityIndicatorView class]]) 
      [view removeFromSuperview]; 
    } 
} 

Co zrobi ta klasa? Będzie pobierać obrazy z serwera i zapisywać je w katalogu z dokumentami aplikacji, a następnie pobrać z lokalnego, jeśli jest dostępny.

Jak tego użyć? Ustaw klasę DImageView w pliku nib dla UIImageView.

Następnie można po prostu użyć go jak poniżej w pliku .m.

[imgViewName processImageDataWithURLString:imageURl]; 
Powiązane problemy