我有一個應用程序,下載並顯示大量的圖像解析。幾乎每分鐘都會將圖像添加到數據庫中。由於PFFile是自動緩存的,沒有過期日期,即使我只需要顯示最近的圖像,舊的圖像仍然留在緩存中,因此佔用了大量的存儲空間。正因爲如此,該應用程序在iPhone上需要大約5GB的存儲空間。我一直在研究這個問題,並發現Parse沒有清理PFFile Cache的公共API,也不允許在緩存文件上設置過期日期。有沒有解決方法,我可以手動刪除舊的緩存數據?如何清除PFFIle緩存(Parse.com)
預先感謝您。
我有一個應用程序,下載並顯示大量的圖像解析。幾乎每分鐘都會將圖像添加到數據庫中。由於PFFile是自動緩存的,沒有過期日期,即使我只需要顯示最近的圖像,舊的圖像仍然留在緩存中,因此佔用了大量的存儲空間。正因爲如此,該應用程序在iPhone上需要大約5GB的存儲空間。我一直在研究這個問題,並發現Parse沒有清理PFFile Cache的公共API,也不允許在緩存文件上設置過期日期。有沒有解決方法,我可以手動刪除舊的緩存數據?如何清除PFFIle緩存(Parse.com)
預先感謝您。
根據Hector的這個答案:https://www.parse.com/questions/pffile-cache-size如果你堅持,你可以手動清除你的應用程序〜/ Library/Caches文件夾。不過,我相當肯定這也會影響NSURL/AFNetworking緩存等等。
我的建議?不要使用PFFile下載文件。 PFFile可以將遠程URL返回到Parse站點上的遠程URL,因此您可以將它傳遞給AFNetworking或NSURLSession等實際爲您下載映像,然後您可以分配緩存生命週期(或自己管理它),因爲這些系統實際上支持,不像PFFile。
以下是您可以用來清理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;
}
}
}
我對此非常小心,因爲您正在解析用於存儲緩存的路徑。它*應該*是相對安全的,但是如果他們在將來的SDK更新中改變它,你需要觀察它。真正的解析應該只是支持這一點,如果他們不這樣做,你總是可以像我在我的回答中提到的那樣自己處理下載。 – 2014-11-07 16:40:31
我不確定在100%,但對我來說這種方法很好 – 2015-01-29 13:59:21
仍然適用於Parse 1.4.2。我已經翻譯成Swift,因爲這就是我需要它的方式。 – TimWhiting 2015-08-10 23:30:19
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")
}
}
}
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)")
}
}
謝謝我使用SDWebImage從PFFile URL異步下載圖像。 – Subash 2014-11-06 22:32:54