2014-11-05 5 views
3

구문 분석을 통해 많은 이미지를 다운로드하고 표시하는 앱이 있습니다. 이미지는 거의 1 분마다 데이터베이스에 추가됩니다. PFFile은 만료 날짜없이 자동으로 캐시되기 때문에 최근 이미지 만 표시하면되지만 오래된 이미지는 여전히 캐시에 남아있어 많은 저장 공간을 차지합니다. 이 때문에 앱은 내 iPhone에 약 5GB의 저장 공간을 필요로합니다. 필자는이 문제에 대해 많은 연구를 해왔으며 Parse에는 PFFile 캐시 정리를위한 공개 API가없고 또한 캐시 된 파일의 만료 날짜 설정을 허용하지 않는다는 사실이 발견되었습니다. 이전 캐시 데이터를 수동으로 삭제할 수있는 해결 방법이 있습니까?PFFIle 캐시 지우기 방법 (Parse.com)

미리 감사드립니다.

답변

1

헥터에서 나온 대답 : https://www.parse.com/questions/pffile-cache-size 당신이 그것을 고집하지 않으면 수동으로 응용 프로그램 ~/Library/Caches 폴더를 지울 수 있습니다. 그러나 이것은 NSURL/AFNetworking 캐시와 같은 것들에도 영향을 줄 것이라고 확신합니다.

나의 제안이 있습니까? PFFile을 사용하여 파일을 다운로드하지 마십시오. PFFile은 Parse의 사이트에서 호스팅되는 곳으로 원격 URL을 제공하므로 AFNetworking 또는 NSURLSession과 같은 것으로 전달하여 실제로 이미지를 다운로드 한 다음 캐시 수명을 할당 할 수 있습니다 (또는 직접 관리 할 수 ​​있음). 시스템은 PFFile과 달리 실제로이를 지원합니다.

+0

감사합니다. 나는 SDWebImage를 사용하여 PFFile URL에서 이미지를 비동기 적으로 다운로드했습니다. – Subash

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 업데이트에서 변경하면이를 지켜 볼 필요가 있습니다. 정말 구문 분석이 지원해야합니다, 그리고 만약 그들이 당신이 항상 그냥 내 대답에서 언급 한 것처럼 다운로드를 처리 할 수 ​​있습니다. –

+0

100 %는 확실하지 않지만이 방법은 훌륭합니다. –

+0

Parse 1.4.2와 호환됩니다. 내가 그것을 필요로했기 때문에 나는 Swift로 번역했다. – TimWhiting

1

deadbeef 님의 답변이 필요한 사람에게는 신속한 답변입니다.

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을 사용하고 매트 S가, 난 그냥이 사용하고 말하는 것처럼 자신의 캐시 시스템을 사용하는 것이 좋습니다 생각 말해야한다 테스트 목적. 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)") 
    } 
}