2014-11-05 21 views
3

我有一個應用程序,下載並顯示大量的圖像解析。幾乎每分鐘都會將圖像添加到數據庫中。由於PFFile是自動緩存的,沒有過期日期,即使我只需要顯示最近的圖像,舊的圖像仍然留在緩存中,因此佔用了大量的存儲空間。正因爲如此,該應用程序在iPhone上需要大約5GB的存儲空間。我一直在研究這個問題,並發現Parse沒有清理PFFile Cache的公共API,也不允許在緩存文件上設置過期日期。有沒有解決方法,我可以手動刪除舊的緩存數據?如何清除PFFIle緩存(Parse.com)

預先感謝您。

回答

1

根據Hector的這個答案:https://www.parse.com/questions/pffile-cache-size如果你堅持,你可以手動清除你的應用程序〜/ Library/Caches文件夾。不過,我相當肯定這也會影響NSURL/AFNetworking緩存等等。

我的建議?不要使用PFFile下載文件。 PFFile可以將遠程URL返回到Parse站點上的遠程URL,因此您可以將它傳遞給AFNetworking或NSURLSession等實際爲您下載映像,然後您可以分配緩存生命週期(或自己管理它),因爲這些系統實際上支持,不像PFFile。

+0

謝謝我使用SDWebImage從PFFile URL異步下載圖像。 – Subash 2014-11-06 22:32:54

10

以下是您可以用來清理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; 
     } 
    } 
} 
+0

我對此非常小心,因爲您正在解析用於存儲緩存的路徑。它*應該*是相對安全的,但是如果他們在將來的SDK更新中改變它,你需要觀察它。真正的解析應該只是支持這一點,如果他們不這樣做,你總是可以像我在我的回答中提到的那樣自己處理下載。 – 2014-11-07 16:40:31

+0

我不確定在100%,但對我來說這種方法很好 – 2015-01-29 13:59:21

+0

仍然適用於Parse 1.4.2。我已經翻譯成Swift,因爲這就是我需要它的方式。 – TimWhiting 2015-08-10 23:30:19

1

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

TimWhiting的回答翻譯成雨燕2.1:

注:我不得不說認爲是更好地使用文件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)") 
    } 
}