需要帮助快速搜索iOS Property List(plist)的值?

时间:2011-10-21 16:29:37

标签: objective-c ios plist nsdictionary

我目前在我的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
 }

2 个答案:

答案 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 :)来查找交集。