【问题标题】:Saving / reloading images, and deleting older images保存/重新加载图像,并删除旧图像
【发布时间】:2011-05-18 13:34:29
【问题描述】:

我正在从 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 张图像)?有什么好的技术吗?

【问题讨论】:

    标签: iphone ios uiimage nsuserdefaults


    【解决方案1】:

    根据您的目的,您可以在多个位置保存下载的图像:

    • 如果你想保存文件直到你删除它,写到文档目录:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
    • 如果您想存储文件直到删除它,并且您可能曾经使用过iTunes file sharing,并且不想共享这些特定文件,请写入应用程序支持目录:[NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) objectAtIndex:0]
    • 如果您想在设备空间不足时允许系统将其删除(并且不在乎是否在设备备份时保存),请使用缓存目录:[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]
    • 如果您只是在处理时临时保存它并立即将其删除,请使用临时目录:NSTemporaryDirectory()

    如果您需要任何保留规则,例如“仅保留 10 条”或“一天后删除”,您必须自己在代码中实现。您可以依赖文件修改日期(来自 NSFileManager 的 attributesOfItemAtPath:error:),或者在 NSUserDefaults 或 Core Data 中保留文件名到日期的映射,或者只命名文件以包含日期。

    【讨论】:

      【解决方案2】:

      当涉及到图像时,我建议将它们保存到磁盘,应用程序的沙箱中有 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】:

        我首先会使用出色的ASIHTTPRequest library 来下载图像:)

        这取代了 NSURLConnection,您可以指定如何缓存图片 - 您只需从相同的 URL 重新请求图片,ASIHTTPRequest 将返回缓存的图片。

        【讨论】:

        • 是否有 ASIHTTPRequest 缓存图像用于 UITableView 的工作示例?
        猜你喜欢
        • 2013-01-25
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 2019-10-21
        • 1970-01-01
        • 1970-01-01
        • 2020-03-04
        • 1970-01-01
        相关资源
        最近更新 更多