2011-05-18 83 views
2

我从Web服务器加载图像文件,然后将其保存到nsuserdefaults。保存代码大致是:保存/重新加载图像并删除旧图像

NSData *imageData = UIImagePNGRepresentation(theImage); // theImage is a UIImage 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:imageData forKey:string]; // string is a 3-dig number which identifies image 

现在,显然我在错误的脚已经,因为不推荐用于图像NSUserDefaults的..

但我想要做的是保存在某个地方这些图像,因此无需重新下载即可访问它们。此外,我想删除旧图像(假设一天过去,或只保留最近10次下载的图像)?有这个好技术吗?

回答

2

我会用出色的ASIHTTPRequest library下载图像摆在首位:)

这取代NSURLConnection的,你可以指定如何缓存图像 - 你只需重新请求来自同一个URL的图像和ASIHTTPRequest将返回缓存的。

+0

是否有一个在UITableView中使用的ASIHTTPRequest缓存图像的工作示例? – cannyboy 2011-05-20 11:35:33

3

说到图像,我建议将它们保存到磁盘,应用程序的沙箱中有Documents文件夹。您可以轻松地将文件的名称存储在userdefaults中,并稍后使用它来访问该文件。

如果你想找出如果图像是“太老了”,你可以做这样的事情:

int aDayInSeconds = 60 * 60 * 24; 

NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:fileName 
                      error:nil]; 
NSDate *creationDate = [attributes objectForKey:@"NSFileCreationDate"]; 

if ([[NSDate date] timeIntervalSinceDate:creationDate] > aDayInSeconds) { 
    // Delete, reload, whatever you need. 
} 
3

根据你的目的,也有一些地方,你可以保存下载的图像:

  • 如果你想保存,直到被删除的文件,写入文件目录:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
  • 如果你想存储文件,直到你删除它,你可能曾经使用iTunes file sharing也不要WA nt这些特定的文件共享,写入应用程序支持目录:[NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) objectAtIndex:0]
  • 如果您想允许系统删除它,如果设备空间不足(并且不关心它是否在设备备份时保存以上),使用高速缓存目录:[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]
  • 如果你只是保存它暂时当你处理它,并会删除它向右走,使用的临时目录:如果您想要的任何保留规则像NSTemporaryDirectory()

“只保留10个”或“在一天之后删除”,你必须自己在代码中实现它。您可以依赖文件修改日期(来自NSFileManager的attributesOfItemAtPath:error:),或者在NSUserDefaults或Core Data中保留文件名到最新的映射,或者只是命名文件以包含日期。

相关问题