2015-07-24 3 views
7

mia esigenza è:Quale classe Imageview di terze parti devo utilizzare?

  1. bisogno di mostrare immagini in imageview da URL del server & salvarlo per l'utilizzo offline anche.
  2. Ma ci possono essere possibilità che la stessa immagine URL possa essere aggiornata.

Ho provato EGOImageview, AsyncImageview, FXImageview, Haneke, tutte le classi che ho provato. la mia prima parte del requisito è stata raggiunta. ma non secondo..i.e se l'immagine del link "xxxxx" viene mostrata per la prima volta .... se sullo stesso link l'immagine viene aggiornata, l'app mostra solo la vecchia immagine ...

+0

hai provato questo - [[NSURLCache sharedURLCache] removeAllCachedResponses]; – Nayan

+0

SDWebImage è buono, non ha mai avuto problemi con esso: https://github.com/rs/SDWebImage – Jasper

+0

@Jasper sei sicuro di SDWebImage, che soddisferà il mio secondo requisito. – Kalyani

risposta

1

Dovresti dare un'occhiata a SDWebImage. È una delle categorie UIImageView più utilizzate al momento e offre molte funzionalità, inclusa la memorizzazione nella cache.

Date un'occhiata a questa parte della documentazione per imparare a aggiornare la cache con esso: Handle image refresh

+0

ho provato questo, ma ancora il mio secondo requisito non è raggiunto ... :(.. – Kalyani

3

È possibile utilizzare la classe di sotto che completa riempire il vostro requisito

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]; 
    } 
} 

Cosa farà questa lezione? Scaricherà le immagini dal server e lo salverà nella directory del documento dell'applicazione e lo otterrà dal locale se disponibile.

Come si usa? Impostare la classe DImageView nel file nib per UIImageView.

Quindi è possibile semplicemente utilizzarlo come di seguito nel file .m.

[imgViewName processImageDataWithURLString:imageURl];