延迟加载plist字典元素

时间:2014-12-09 02:38:13

标签: ios objective-c

从plist中包含的字典加载数据的常用方法如下:

NSString *path = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
NSDictionary *data= [NSDictionary dictionaryWithContentsOfFile:path];

有没有办法只导入一个键/一组键中指定的元素,如:

NSDictionary *data= [NSDictionary dictionaryWithContentsOfFile:path forKey:key];

这个想法是按密钥执行字典内容的延迟加载。

2 个答案:

答案 0 :(得分:0)

请尝试以下方法。

- (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"];   

}

答案 1 :(得分:0)

因此,根据我上面的评论,您可以通过类别向NSDictionary添加类方法。你可以做类似的事情(没有测试BTW)。

+ (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文件时使用了这个。这主要是它的块流。它是事件驱动的,因此您应该能够将其流入并检测您想要的密钥(希望如此)。