Подсчет вхождений определенных значений в нескольких NSDictionnary в Info.plist - PullRequest
0 голосов
/ 25 февраля 2011

У меня есть файл .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 , мне все равно) это значение того, сколько вхождений " exclamation.png " есть в моем списке.(в приведенном выше примере это было бы '2') (тогда это число станет номером приложения)

Я пробовал много разных вещей (в том числе преобразование 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 ]

2 голосов
/ 25 февраля 2011

[Непроверенные; вероятно компилируется]

NSArray *dicts = [NSArray arrayWithContentsOfFile:@"my.plist"];
NSUInteger count = 0;
for (NSDictionary *dict in dicts) {
    if ([[dict objectForKey:@"imageFilePath"] isEqualToString:@"exclamation.png"]) {
        ++count;
    }
}
0 голосов
/ 25 февраля 2011

[ Игнорировать: Предикаты только быстрее в Core Data - 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"]];

В последней строке написано: указать массиву fromPlist вернуть другой массив, состоящий из объектов, соответствующих тесту предиката.Затем возьмите счетчик возвращенного массива.

Это намного быстрее (10>), чем цикл, особенно для больших массивов.Более того, ваш предикат может быть произвольно сложным, т. Е. Вы можете тестировать несколько атрибутов разными способами в каждом предикате.Вы также можете сохранить предикаты и использовать их повторно, даже если они содержат переменные.

Сочетание кодирования ключ-значение, операторов сбора, например, @count, и предикатов является чрезвычайно мощным.Умение правильно их использовать открывает огромные улучшения в скорости, надежности и гибкости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...