Как я могу получить данные из plist

Привет у меня есть листинг следующего формата

Я хочу отсортировать эти книги по их категориям. У меня есть массив "TotalCategory" со всеми идентификаторами категорий (например, cat1,cat2..), я хочу открыть приведенный ниже список и проверить с каждой книгой и ее идентификатором категории, соответствует ли он или нет. Если идентификатор категории у меня есть, сопоставление с идентификатором категории данной книги, затем я хочу добавить этот идентификатор категории и идентификатор книги (ставку) в новый словарь. Возможно ли это?

NSDictionary *booksPlist = [[NSDictionary alloc] initWithContentsOfFile:path];
NSArray *categoryId=[[booksPlist objectForKey:@"catlist"]valueForKey:@"cid"];
NSLog(@"%@",categoryId);

// getting category list

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *allBooksPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Allbooks.plist"];
NSDictionary *allBookPlist=[[NSDictionary alloc]initWithContentsOfFile:allBooksPath];

NSArray *bookid=[[allBookPlist objectForKey:@"listbook"]valueForKey:@"bid"];
NSString *s=[[[allBookPlist objectForKey:@"listbook"]objectForKey:@"cate" ]valueForKey:@"categories"];  //// this line shows exception


 NSLog(@"%@",s); 

/// Я ХОЧУ ЭТО::: Я хочу проверить идентификатор категории со мной и идентификаторы категории внутри каждой книги, если она совпадает, затем получить идентификатор этой книги (ставка), вот и все

1 ответ

Решение

Не совсем понятно, каков ваш запрос, но я вижу несколько проблем с вашим кодом.

Прежде всего, не путайте -objectForKey: метод NSDictionary с valueForKey: метод неформального протокола NSKeyValueCoding,

Последний используется для KVC доступ и лучше не смешивать их, не зная об этом. Это может работать, но может также взорваться при некоторых обстоятельствах. Придерживаться objectForKey: или лучше вы можете использовать современный подписной синтаксис

[dict objectForKey:@"whatever"];

эквивалентно

dict[@"whatever"];

Тем не менее, давайте столкнемся с вашей конкретной проблемой. Прежде всего listbook это массив, так что вы не можете сделать

[[allBookPlist objectForKey:@"listbook"]valueForKey:@"bid"];

Сначала вам нужно получить доступ к элементу массива, поэтому в современном синтаксисе вы должны сделать

NSString * bookId = allBookPlist[@"listbook"][0][@"bid"];

чтобы получить bid первого элемента. Если вы хотите собрать их, просто переберите массив

NSArray * books = allBookPlist[@"listbook"];
NSMutableArray * bookIds = [@[] mutableCopy]
for (NSDictionary * book in books) {
     [bookIds addObject:book[@"bid"]];
}

Аналогичный подход можно использовать для получения категорий из каждой книги.

Другие вопросы по тегам