iPhone - 用户默认值和UIImages

时间:2010-04-12 20:30:01

标签: iphone cocoa-touch uiimage nsuserdefaults

过去几个月我一直在开发iPhone应用程序。最近我想提升性能并缓存UI中使用的一些图像。用户从网上随机下载图像,因此我无法将特定图像添加到项目中。我也已经在使用NSUserDefaults在应用程序中保存其他信息。

所以现在我正在尝试将UIImages的字典保存到我的NSUserDefaults对象并获得......

- [UIImage encodeWithCoder:]:无法识别的选择器发送到实例

然后我决定使用名为UISaveableImage的类继承UIImage并实现NSCoding。所以我现在......

@implementation UISaveableImage

-(void)encodeWithCoder:(NSCoder *)encoder
{
   [encoder encodeObject:super forKey:@"image"];
}

-(id)initWithCoder:(NSCoder *)decoder
{
    if (self=[super init]){
        super =  [decoder decodeObjectForKey:@"image"];
    }
    return self;
}

@end

这并不比我开始时更好。如果我能够将UIImage转换为NSData我会很好,但我能找到的功能就像UIImagePNGRepresentation,它要求我知道这是什么类型的图像。 UIImage不允许我做的事情。思考?我觉得我可能走错了路......

2 个答案:

答案 0 :(得分:6)

您不希望在NSUserDefaults中存储图像。它们是大量数据,NSUserDefaults存储为plist;你想写一小部分信息。

您应该将图像写入磁盘,然后将文件名存储为默认值:

NSString   *filename = myImageFilename;
[UIImagePNGRepresentation(image) writeToFile: myImageFilename atomically];
[[NSUserDefaults standardDefaults] setObject: myImageFilename forKey: @"lastImageFilename"]; 

答案 1 :(得分:1)

一年之后磕磕绊绊。我想添加(以防其他人在这里偶然发现)你应该将图像存储在缓存目录中,并避免iTunes尝试备份它们。

- (NSString *)pathForSearchPath:(NSSearchPathDirectory)searchPath {
  NSArray *paths = NSSearchPathForDirectoriesInDomains(searchPath, NSUserDomainMask, YES);
  NSString *directoryPath = [paths objectAtIndex:0];
  return directoryPath;
}

- (NSString *)cacheDirectoryPath {
  return [self pathForSearchPath:NSCachesDirectory];
}