从 plist 中包含的字典加载数据的常用方法如下:
NSString *path = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
NSDictionary *data= [NSDictionary dictionaryWithContentsOfFile:path];
有没有办法只导入键/键集中指定的元素,例如:
NSDictionary *data= [NSDictionary dictionaryWithContentsOfFile:path forKey:key];
这个想法是通过键执行字典内容的延迟加载。
因此,根据我上面的评论,您可以通过类别将类方法添加到 NSDictionary。你可以做类似的事情(未经测试的顺便说一句)。
+ (NSDictionary *)dictionaryWithContentsOfFile:(NSString *)path forKeys:(NSArray *)keys
{
NSMutableDictionary *newDictionary = nil;
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:path];
if (dictionary) {
newDictionary = [NSMutableDictionary dictionary];
for (id key in dictionary.allKeys) {
if ([keys containsObject:key]) {
newDictionary[key] = dictionary[key];
}
}
}
return [newDictionary copy];
}
如果你这样做,你会看到你的内存峰值,但一旦字典被释放,它应该会消退。
或者,看看YAJL(https://github.com/lloyd/yajl)。我在处理非常大的 JSON 文件时使用了它。这主要是分块流式传输。它是事件驱动的,所以你应该能够流式传输它并检测你想要的密钥(希望如此)。
请尝试以下方法。
- (void)viewDidLoad
{
NSMutableArray *arry;
arry = [[NSMutableArray alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Catalog" ofType:@"plist"];
NSDictionary *dic = [menuArray objectAtIndex:indexPath.row];
lblName.text = [dic objectForKey:@"MenuName"];
}