我目前在我的iOS项目中有一个plist文件,当有更新时它会从网上下载,它包含新闻文章列表和图像。
应用程序将图像缓存在iPhone上以供离线访问,我目前正在尝试编写一个能够经常清理缓存文件的函数。
目前我有这个代码在Temp文件夹中查找图像然后删除它们,但是对于找到的每个图像,我希望它检查文件名是否作为删除前存储为NSDictionary的plist中的值存在,但是我不确定在不需要for语句的情况下搜索NSDictionary的快速方法。
任何提示都会很棒。
NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:TMP error:nil];
if (files == nil) {
// error...
NSLog(@"no files found");
}
for (NSString *file in files) {
NSString *uniquePath = [TMP stringByAppendingPathComponent: file];
if([file rangeOfString: @".png" options: NSCaseInsensitiveSearch].location != NSNotFound)
{
NSLog(@"%@", file);
if ([[NSFileManager defaultManager] removeItemAtPath: uniquePath error: NULL] == YES)
NSLog (@"Remove successful");
else
NSLog (@"Remove failed");
}
}
修改
我目前已经添加了这个不确定它是否是最好的方法,但它有效。
NSArray *newsArray = [self.newsData allValues];
// Convert the Array into a string
NSString *newsString = [newsArray description];
// Perform Range Search.
NSRange range;
range = [newsString rangeOfString : filename];
if (range.location != NSNotFound) {
NSLog(@"The file exists in the plist %@", filename);
} else {
// Delete the file
}
答案 0 :(得分:0)
您可以使用NSPredicate
缩小数组以使其仅包含您感兴趣的对象,然后快速循环您要删除的对象。像这样:
NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:TMP error:nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] '.png'"];
NSArray *filteredArray = [files filteredArrayUsingPredicate:thePredicate];
for (NSString *file in filteredArray) {
NSString *uniquePath = [TMP stringByAppendingPathComponent:file];
if ([[NSFileManager defaultManager] removeItemAtPath: uniquePath error: NULL])
NSLog (@"Remove successful");
else
NSLog (@"Remove failed");
}
这意味着for循环仅循环您感兴趣的对象。
答案 1 :(得分:0)
由于你不关心plist或文件夹中的文件序列而你显然不会有重复,所以使用NSSet而不是NSArray然后使用intersect方法(intersectsSet :)来查找交集。