【问题标题】:How to Clear PFFIle Cache (Parse.com)如何清除 PFFIle 缓存 (Parse.com)
【发布时间】:2015-01-02 06:04:23
【问题描述】:

我有一个应用程序可以下载并显示大量来自 parse 的图像。几乎每分钟都会将图像添加到数据库中。由于 PFFile 是自动缓存的,没有过期时间,即使我只需要显示最近的图像,旧的图像仍然保留在缓存中,因此占用了大量的存储空间。因此,现在该应用程序在我的 iPhone 上占用了大约 5GB 的存储空间。我一直在对这个问题进行大量研究,发现 Parse 没有用于清理 PFFile Cache 的公共 api,也不允许在缓存文件上设置过期日期。是否有解决方法,我可以手动删除较旧的缓存数据?

提前谢谢你。

【问题讨论】:

    标签: ios caching parse-platform nscache pffile


    【解决方案1】:

    TimWhiting 的答案翻译成 Swift 2.1:

    注意:我不得不说,正如 Matt S 所说,我认为最好使用文件 url 并使用您自己的缓存系统,我只是出于测试目的使用它。我还希望 Parse 可以为我们提供正确的路径,而不必对其进行硬编码,这就是为什么我认为使用 URL 更好。

    func cleanUpParseDirectory(){
        let parseFilesCache = "Parse/PFFileCache"
        let fileManager = NSFileManager.defaultManager()
        let cacheDirectoryURL  = fileManager.URLsForDirectory(NSSearchPathDirectory.CachesDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
        let PFFileCacheDirectoryURL = cacheDirectoryURL[0].URLByAppendingPathComponent(parseFilesCache, isDirectory: true)
        do {
            let PFFileCacheDirectory = try fileManager.contentsOfDirectoryAtURL(PFFileCacheDirectoryURL, includingPropertiesForKeys: nil, options: [])
            print("number of cached files: \(PFFileCacheDirectory.count)")
            for fileURL in PFFileCacheDirectory {
                try fileManager.removeItemAtURL(fileURL)
            }
            print("Success removing items")
        } catch let error {
            print("Error: \(error)")
        }
    }
    

    【讨论】:

      【解决方案2】:

      deadbeef 的答案被翻译成 Swift 供任何需要的人使用。

      func cleanUpParseDirectory(){
      
          var error: NSError?
      
          var fileManager: NSFileManager = NSFileManager.defaultManager()
      
          var cacheDirectoryURL: [NSURL] = fileManager.URLsForDirectory(NSSearchPathDirectory.CachesDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask) as! [NSURL]
      
          var PFFileCacheDirectoryURL: NSURL = cacheDirectoryURL[0].URLByAppendingPathComponent("Parse/PFFileCache", isDirectory: true)
      
          var PFFileCacheDirectory: [AnyObject]? = fileManager.contentsOfDirectoryAtURL(PFFileCacheDirectoryURL, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.allZeros, error: &error)// [fileManager contentsOfDirectoryAtURL:PFFileCacheDirectoryURL includingPropertiesForKeys:nil options:0 error:&error];
      
          if (PFFileCacheDirectory == nil || error != nil) {
              if ((error != NSFileReadNoSuchFileError && error!.code != NSFileReadNoSuchFileError)) {
                  println("error finding path")
              } else {
                  println("no error finding path")
              }
              return
          }
      
          println("number of cached files: \(PFFileCacheDirectory!.count)")
      
          for fileURL in PFFileCacheDirectory! {
      
      
              var success: Bool = fileManager.removeItemAtURL(fileURL as! NSURL, error: &error)
      
              if ((!success != false || error != nil) ) {
      
                  println("error removing item")
      
                  error = nil
      
              } else {
                  println("success removing item")
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        这是一种可用于清理 PFFile 缓存的方法。如果您在应用程序启动时调用它,在初始化 Parse 之前,我认为它应该是安全的。如果您不想删除所有内容,可以在 for 循环中检查文件创建日期。

        + (void)cleanUpPFFileCacheDirectory
        {
            NSError *error = nil;
            NSFileManager *fileManager = [NSFileManager defaultManager];
            NSURL *cacheDirectoryURL = [[fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
            NSURL *PFFileCacheDirectoryURL = [cacheDirectoryURL URLByAppendingPathComponent:@"Parse/PFFileCache" isDirectory:YES];
            NSArray *PFFileCacheDirectory = [fileManager contentsOfDirectoryAtURL:PFFileCacheDirectoryURL includingPropertiesForKeys:nil options:0 error:&error];
        
            if (!PFFileCacheDirectory || error) {
                if (error && error.code != NSFileReadNoSuchFileError) {
                    NSLog(@"Error : Retrieving content of directory at URL %@ failed with error : %@", PFFileCacheDirectoryURL, error);
                }
                return;
            }
        
            for (NSURL *fileURL in PFFileCacheDirectory) {
                BOOL success = [fileManager removeItemAtURL:fileURL error:&error];
                if (!success || error) {
                    NSLog(@"Error : Removing item at URL %@ failed with error : %@", fileURL, error);
                    error = nil;
                }
            }
        }
        

        【讨论】:

        • 我会非常小心,因为您正在硬编码 parse 用于存储该缓存的路径。它应该相对安全,但如果他们在未来的 SDK 更新中更改它,您需要注意这一点。真正的 Parse 应该只支持这一点,如果他们不支持,你总是可以像我在回答中提到的那样自己处理下载。
        • 我不确定 100% 但对我来说这个方法很棒
        • 仍然适用于 Parse 1.4.2。我已经翻译成 Swift,因为这就是我需要它的方式。
        【解决方案4】:

        根据 Hector 的回答:https://www.parse.com/questions/pffile-cache-size 如果您坚持,您可以手动清除应用程序 ~/Library/Caches 文件夹。不过,我相当肯定这也会影响 NSURL/AFNetworking 缓存等内容。

        我的建议?不要使用 PFFile 下载文件。 PFFile 将远程 URL 返回到它在 Parse 站点上托管的位置,因此您可以将其传递给 AFNetworking 或 NSURLSession 之类的东西以实际为您下载图像,然后您可以分配缓存生命周期(或自己管理),因为那些与 PFFile 不同,系统实际上支持这一点。

        【讨论】:

        • 感谢我使用 SDWebImage 从 PFFile URL 异步下载图像。
        猜你喜欢
        • 2014-12-10
        • 2015-12-18
        • 1970-01-01
        • 2012-11-12
        • 2011-05-10
        • 2015-07-24
        • 2011-11-04
        • 2017-02-11
        • 2020-03-13
        相关资源
        最近更新 更多