计算Info.plist中几个NSDictionary中特定值的出现次数

时间:2011-02-25 14:51:16

标签: iphone objective-c dictionary count plist

我有一个.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....    

}

2 个答案:

答案 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,谓词非常强大。学会好好利用它们可以大大提高速度,可靠性和灵活性。