What third class should Imageview use?

My requirement:

  • You must show the image in image view mode from the server URL and save it for offline use.
  • But there may be a chance that the same URL could be updated.

I tried EGOImageview, AsyncImageview, FXImageview, Haneke thsese, all the classes I tried. My first part of the requirement has been reached. but not the second. If you see the link image "xxxxx" ... for the first time .... if the link is upside down on the same image, the application displays only the old image ...

+7
objective-c uiimageview imageview
source share
2 answers

You can use the following class, which will completely fill your requirement

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

What will this class do? It downloads images from the server and saves them in the application document directory. Retrieves it from local, if available.

How to use it? Define the DImageView class in the nib file of the UIImageView .

Then you can simply use it as shown below in the .m file.

  [imgViewName processImageDataWithURLString:imageURl]; 
+3
source share

You should take a look at SDWebImage . This is one of the most popular categories of UIImageView and offers many features, including caching.

Take a look at this part of the documentation to learn how to update its cache: Process image update

+1
source share

All Articles