我的要求是:
>需要从服务器URL& ;;在imageview中显示图像保存以供离线使用.
>但可能有可能更新相同的URL图像.
我试过EGOImageview,AsyncImageview,FXImageview,Haneke thsese我试过的所有课程.
我的第一部分要求已经实现.但不是第二次..如果第一次显示“xxxxx”链接图像….如果在同一链接图像上升,app只显示旧图像…
解决方法
您可以使用以下完全满足您要求的课程
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:@"%@/%@",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,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]; } }
这堂课会做什么?
它将从服务器下载图像并将其保存到应用程序文档目录,如果可用,则从本地获取.
怎么用?
在你的nib文件中为UIImageView设置DImageView类.
然后,您只需在.m文件中使用它,如下所示.
[imgViewName processImageDataWithURLString:imageURl];