2012-01-03 5 views
3

내 이미지를 디렉토리 (/ Library/Caches/ImageCache /)에 저장합니다. 디렉토리가 특정 크기를 초과하면 디렉토리에서 가장 오래된 파일을 삭제하고 싶습니다. 이 작업을 수행하기 위해 NSFileManager를 사용하여 디렉터리 내용을 검색합니다. 그런 다음이 배열을 날짜별로 정렬하고 가장 오래된 개체를 삭제하려고합니다.NSURL 객체 배열을 생성 날짜순으로 정렬

내 문제는 NSURLCreationDateKey 키를 사용하여 배열을 정렬하려고 할 때 프로그램이 충돌한다는 것입니다.

NSFileManager *defaultFM = [NSFileManager defaultManager]; 
NSArray *keys = [NSArray arrayWithObjects:NSURLNameKey, NSURLCreationDateKey, nil]; 
NSURL *cacheDirectory = [self photoCacheDirectory]; // method that returns cache URL 
NSArray *cacheContents = [defaultFM contentsOfDirectoryAtURL:cacheDirectory 
            includingPropertiesForKeys:keys 
                options:NSDirectoryEnumerationSkipsSubdirectoryDescendants 
                 error:nil]; 

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:NSURLCreationDateKey ascending:YES]; 
NSArray *sortedArray = [cacheContents sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

프로그램이 마지막 줄에서 충돌합니다. 앱 종료

* 의한 캐치되지 않는 예외 'NSUnknownKeyException'이유로 : 오류 '[valueForUndefinedKey는 :] :이 클래스는 부호화 호환 키 NSURLCreationDateKey위한 키값이 아닙니다.'

답변

5

편집 : 더 나은 대답

문제가 해결되지 않으면, 당신이 당신의 자신의 비교기 블록을 작성하고 날짜를 수동 :(

[cacheContents sortUsingComparator:^ (NSURL *a, NSURL *b) { 
    // get the two dates 
    id da = [[a resourceValuesForKeys:[NSArray arrayWithObject:NSURLCreationDateKey] error:nil] objectForKey:NSURLCreationDateKey]; 
    id db = [[b resourceValuesForKeys:[NSArray arrayWithObject:NSURLCreationDateKey] error:nil] objectForKey:NSURLCreationDateKey]; 

    // compare them 
    return [da compare:db]; 
}]; 

(동일 면책 조항 여전히 비교 하시고해야합니다 적용하지만 컴파일 것조차 확실하지 않다) - 당신이 비록 아이디어를 얻을) 여기


! 내 첫 번째 답변입니다. (후손을 위해 여기에 포함되어 있지만 대개 문제를 제대로 읽는 것이 얼마나 중요한지 보여줍니다. :)

NSURL의 배열을 가져 왔기 때문에 발생했습니다. 여기에는 NSURLCreationDateKey 속성이 없습니다.

NSString *key = [NSString stringWithFormat:@"fileAttributes.%@", NSURLCreationDateKey]; 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:key ascending:YES]; 

으로 정렬 할 수 귀하의 키는 열거의 속성, 차례로, 인 fileAttributes 사전의 한 속성입니다 - (100 %는 작동 면책 조항)

이보십시오.

+0

제안 학장님께 감사드립니다. 그래도 여전히 같은 오류가 발생합니다. –

+0

정확히 같으면 안됩니다. '이 클래스는 키 파일에 대해 키 값 코딩을 준수하지 않습니다.'- 어쨌든 다른 솔루션에 대한 내 편집을 참조하십시오. – deanWombourne

+0

좋아, 바보 - 나는 당신이 열거자를 사용하고 있다고 가정했지만 질문을 보았을 때, 당신은 분명히 아닙니다. 나는 바보 야! 당신이 원하는 것을하는데 도움이되는 비교기 블록에 대한 편집 된 편집을보십시오! – deanWombourne

0

나는 이것에 대해 긍정적이지는 않지만 contentsOfDirectoryAtURL : 메서드는 KVC 객체가 아닌 URL 목록을 반환한다고 생각합니다. 당신은 NSURL에서 원하는 속성을 얻으려면, 당신은 호출해야합니다 :이 이후

getResourceValue:forKey:error:

이 KVC 호환되지 않습니다, 당신은 정렬 디스크립터를 사용하고, 대신 루틴을 사용해야 할 수 없습니다 like [cacheContents sortedArrayUsingComparator : ...]

+0

안녕하세요, 네 말이 맞아. 내용은 다음을 수행하여 키에 개별적으로 액세스 할 수있는 NSURL 객체의 배열을 반환합니다. NSURL * url = [cachedContents objectAtIndex : 0]; NSDictionary * 값 = [url resourceValuesForKeys : 키 오류 : nil]; 비교기를 사용하면 클래스에 NSURL 개체가 제공 한 두 날짜를 비교하는 다른 메서드를 구현해야합니까? –

관련 문제