Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 文档目录中图像的图像缓存_Iphone_Objective C_Ios_Ipad_Caching - Fatal编程技术网

Iphone 文档目录中图像的图像缓存

Iphone 文档目录中图像的图像缓存,iphone,objective-c,ios,ipad,caching,Iphone,Objective C,Ios,Ipad,Caching,我的应用程序通过HTTP下载一个包含图像的包。它们存储在文档/目录中并显示 我读到UIImage不适用于在iphone/ipad的“../Documents/”目录中缓存图像(因为只有[UIImage ImageName:]使用缓存,并且它只适用于捆绑包中的图像)。此外,我希望在下载新软件包时能够清除缓存 下面是我写的: 在图像中.h #import <Foundation/Foundation.h> @interface Image : NSObject +(void) cle

我的应用程序通过HTTP下载一个包含图像的包。它们存储在文档/目录中并显示

我读到UIImage不适用于在iphone/ipad的“../Documents/”目录中缓存图像(因为只有[UIImage ImageName:]使用缓存,并且它只适用于捆绑包中的图像)。此外,我希望在下载新软件包时能够清除缓存

下面是我写的:

图像中.h

#import <Foundation/Foundation.h>

@interface Image : NSObject

+(void) clearCache;

+(UIImage *) imageInDocuments:(NSString *)imageName ;

+(void)addToDictionary:(NSString *)imageName image:(UIImage *)image;

@end
我写它是为了提高加载图像的性能。但我不确定实施情况如何。我不想产生相反的效果:

  • 有很多重复(从可变措辞到不可变和相反)
  • 我不知道如何选择正确的maxFifo值
  • 你认为我需要处理内存警告并在发生时清除缓存吗
你觉得怎么样?尴尬吗


附:我把代码放在gist.github上:

哇。。。您正在实现自己的对象缓存吗?你有没有先看看它是否适合你的需要


(我认为UIImage不符合NSDiscardableContent,因此如果您希望缓存处理内存不足的情况,您必须自己清除缓存或包装UIImage。但正如您在问题中所指出的,您当前的实现也没有做到这一点。)

哇。。。您正在实现自己的对象缓存吗?你有没有先看看它是否适合你的需要


(我认为UIImage不符合NSDiscardableContent,因此如果您希望缓存处理内存不足的情况,您必须自己清除缓存或包装UIImage。但正如您在问题中所指出的,您当前的实现也没有做到这一点。)

哦,我更正了一些错误。根本没有使用缓存(缺少对addToDictionary的调用)。这还显示了其他错误。哦,我更正了一些错误。根本没有使用缓存(缺少对addToDictionary的调用)。这还显示了其他错误。谢谢,我不知道NSCache。我会用它做一些测试。我可以:1)在我的Image类中包装NSCache,而不是包装UIImage。2) 因此,我可以删除我的NS2字典(和nsinteger)。3) 调用[Image clearCache]时,只需调用NSCache方法[x removeAllObjects]。这对我来说似乎更容易。谢谢,我不知道NSCache。我会用它做一些测试。我可以:1)在我的Image类中包装NSCache,而不是包装UIImage。2) 因此,我可以删除我的NS2字典(和nsinteger)。3) 调用[Image clearCache]时,只需调用NSCache方法[x removeAllObjects]。对我来说似乎更容易。
#import "Image.h"

@implementation Image

static NSDictionary * cache;
static NSDictionary * fifo;
static NSNumber * indexFifo;
static NSInteger maxFifo = 25;

+(void)initialize {
    [self clearCache];
}

+(void) clearCache {
    cache = [[NSDictionary alloc] init];
    fifo = [[NSDictionary alloc] init];
    indexFifo = [NSNumber numberWithInt:0];
}

+(UIImage *) imageInDocuments:(NSString *)imageName {
    UIImage * imageFromCache = [cache objectForKey:imageName];
    if(imageFromCache != nil) return imageFromCache;

    NSString * path = [NSHomeDirectory() stringByAppendingPathComponent:[NSString     stringWithFormat:@"/Documents/%@", imageName, nil]];
    UIImage * result = [UIImage imageWithContentsOfFile:path];
    [self addToDictionary:imageName image:result];
    return result;
}

+(void)addToDictionary:(NSString *)imageName image:(UIImage *)image {

    NSMutableDictionary *mFifo = [fifo mutableCopy];
    NSString * imageToRemoveFromCache = [mFifo objectForKey:indexFifo];
    [mFifo setObject:imageName forKey:indexFifo];
    fifo = [NSDictionary dictionaryWithDictionary:mFifo];
    // indexFifo is like a cursor which loop in the range [0..maxFifo];
    indexFifo = [NSNumber numberWithInt:([indexFifo intValue] + 1) % maxFifo];

    NSMutableDictionary * mcache = [cache mutableCopy];
    [mcache setObject:image forKey:imageName];
    if(imageToRemoveFromCache != nil) [mcache removeObjectForKey:imageToRemoveFromCache];
    cache = [NSDictionary dictionaryWithDictionary:mcache];
}

@end