需要帮助来快速搜索 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)