需要帮助来快速搜索 iOS 属性列表 (plist) 的价值?

Posted

技术标签:

【中文标题】需要帮助来快速搜索 iOS 属性列表 (plist) 的价值?【英文标题】:Need help to quickly search iOS Property List (plist) for value? 【发布时间】:2011-10-21 16:29:36 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可以使用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 循环只会循环您感兴趣的对象。

【讨论】:

感谢我实际上想要进行反向搜索,即遍历设备上的图像文件,然后查看该文件名是否存在于我的 plist 中,因为 plist 将在每次启动时替换为来自网站的全新版本。 我明白了,所以您正在过滤 .png 以简单地捕捉该文件是图像文件,并且您仍然需要逻辑来检查 plist? 我基本上得到了一个文件夹的目录列表,然后对于在磁盘上找到的每个物理图像文件 (png),我需要检查它的文件名是否仍然存在于 plist 文件中 我明白了,你只需要为循环的每次迭代创建一个谓词,然后在从 plist 返回的字典数组上运行它,谓词方法 evaluateWithObject 会告诉你它是否在里面plist 与否,我现在要出去,但我回来时会更新我的答案【参考方案2】:

由于您不关心 plist 或文件夹中的文件顺序,并且您显然不会有重复,因此使用 NSSet 而不是 NSArray,然后使用 intersect 方法 (intersectsSet:) 来查找交集。

【讨论】:

以上是关于需要帮助来快速搜索 iOS 属性列表 (plist) 的价值?的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)

SWIFT 属性列表:从 TableView 到 DetailView plist

iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)

iOS数据持久化之---属性列表

Apple 的 plist 编辑器入门指南:基础操作与高级功能详解

IOS中的属性列表----Property List