我应该使用哪个第三方Imageview类?

时间:2015-07-24 11:36:05

标签: objective-c uiimageview imageview

我的要求是:

  1. 需要在服务器网址&amp ;;的imageview中显示图片保存以供离线使用。
  2. 但可能有可能更新相同的网址图片。
  3. 我试过EGOImageview,AsyncImageview,FXImageview,Haneke thsese我试过的所有课程。 我的第一部分要求已经实现。但不是第二......如果" xxxxx"链接图像首次显示....如果在同一链接图像上升,应用程序仅显示旧图像...

2 个答案:

答案 0 :(得分:2)

您可以使用以下完全符合要求的课程

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

这门课会做什么? 它将从服务器下载图像并将其保存到应用程序文档目录中,如果可用,则从本地获取。

如何使用?nib文件中为UIImageView设置DImageView类。

然后,您只需在.m文件中使用它,如下所示。

 [imgViewName processImageDataWithURLString:imageURl];

答案 1 :(得分:1)

你应该看看SDWebImage。它现在是最常用的UIImageView类别之一,并提供许多功能,包括缓存。

查看文档的这一部分,了解如何使用它刷新缓存:Handle image refresh