延迟加载 plist 字典元素



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

}

最新更新