2012-01-03 34 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属性。

试试这个(免责声明 - 不是100%它会工作)

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

你的关键排序是fileAttributes词典来的属性,反过来,你的枚举的属性。

+0

谢谢你的建议院长。尽管如此,我仍然遇到同样的错误。 – 2012-01-04 00:02:11

+0

如果不应该完全一样,它应该说'这个类不是关键值编码兼容的关键fileAttributes.NSURLCreationDateKey.'' - 无论如何,请参阅我的编辑另一个解决方案:) – deanWombourne 2012-01-04 00:04:18

+0

好的,我是一个白痴 - 我一直假设你使用的是统计员,但看着你的问题,你显然不是。我是个白痴!看到我编辑的比较器块编辑应该帮助做你想做的! – deanWombourne 2012-01-04 00:20:49

0

我对此并不积极,但我认为contentsOfDirectoryAtURL:方法返回的URL不是KVC对象列表。为了让你从NSURL想要的属性,你需要调用:

getResourceValue:forKey:error:

因为这不是KVC兼容的,你将不能够使用一种描述,而是需要使用常规像[cacheContents sortedArrayUsingComparator:...]

+0

嗨罗恩,你说得对。内容返回一个NSURL对象的数组,我可以通过单独访问键来进行操作: NSURL * url = [cachedContents objectAtIndex:0]; NSDictionary * values = [url resourceValuesForKeys:keys error:nil]; 使用比较器,我必须在我的类中实现另一个方法来比较NSURL对象给出的两个日期? – 2012-01-04 00:08:55