我有一个.plist文件,我在我的应用程序中用于存储数据,我检索字典中的所有内容。
以下是plist的样子:
(
{
firstName = "18:43";
imageFilePath = "exclamation.png";// <--- THIS is what I want to track.
lastName = "25/02/2010";
lieu = "Class 045";
prof = "Mr. Maths";
publicationYear = 12;
title = "Mathematics";
},
{
firstName = "16:43";
imageFilePath = "accept.png";// <--- NOT this
lastName = "01/01/2011";
lieu = "Class 045";
prof = "Mr. Maths";
publicationYear = 12;
title = "Mathematics";
},
{
firstName = "16:43";
imageFilePath = "exclamation.png";// <--- THIS
lastName = "25/02/2011";
lieu = "Class 045";
prof = "Mr. Maths";
publicationYear = 12;
title = "Mathematics";
}
)
等......
我只想做一个 int (或 NSNumber ,或 NSInteger ,我并不在乎)是我的plist中出现“ exclamation.png ”的次数的值。 (在上面的例子中,那将是'2') (这个数字将成为App的badgeNumber)
我尝试了很多不同的东西(包括将plist转换成字符串并进行搜索,但这很糟糕)但是我无法让它们中的任何一个工作......
感谢您的想法!
编辑:
这就是我加载plist的方式:
- (void)applicationDidEnterBackground:(UIApplication *)application {
[_listController save];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Books.plist"];
// The code here....
}
答案 0 :(得分:2)
[未测试;可能编译]
NSArray *dicts = [NSArray arrayWithContentsOfFile:@"my.plist"];
NSUInteger count = 0;
for (NSDictionary *dict in dicts) {
if ([[dict objectForKey:@"imageFilePath"] isEqualToString:@"exclamation.png"]) {
++count;
}
}
答案 1 :(得分:0)
[ 忽略: 谓词在核心数据中更快 - techzen]
这是一个更简洁,更快捷的方法:
NSArray *fromPlist=[NSArray arrayWithContentsOfFile:@"my.plist"];
NSPredicate *exPred=[NSPredicate predicateWithFormat:@"imageFilePath==%@",@"exclamation.png"];
// NSNumber *exclamationCount=[[fromPlist filteredArrayUsingPredicate:exPred].@count];
NSNumber *exclamationCount=[[[fromPlist filteredArrayUsingPredicate:exPred] valueForKey:@"@count"]];
最后一行说:tell array fromPlist返回另一个由与谓词测试匹配的对象组成的数组。然后获取返回数组的计数。
这比循环快得多(10>),特别是对于大型阵列。更好的是,你的谓词可以是任意复杂的,即你可以在每个谓词中以多种不同的方式测试多个属性。您也可以保存谓词并重用它们,即使它们包含变量也是如此。
键值编码,收集运算符的组合,例如@count,谓词非常强大。学会好好利用它们可以大大提高速度,可靠性和灵活性。
击>