iOS巨大的JSON(30MB)处理

我需要下载和parsing40mb的json。 现在我正在使用AFJSONRequestOperation,在旧设备上导致内存警告和崩溃。 应该怎么做? 我认为唯一正确的做法是将jsonstream式传输,但是我不知道如何做,或者哪​​个库最好。 请举例说明。 非常感谢!

对于任何有同样问题的人来说,我是这样解决的:1.使用AFHTTPRequestOperation的输出stream将JSON文件下载到本地存储。 2.使用YAJLParserparsing一小块NSData。

结果:我在iPad上testing了50mb的json(1),没有任何内存警告(内存在10mb左右)。

例:

NSError *error = nil; NSData *data = [NSData dataWithContentsOfFile:path options:NSDataReadingMappedAlways | NSDataReadingUncached error:&error]; YAJLParser *parser = [[YAJLParser alloc] initWithParserOptions:YAJLParserOptionsAllowComments]; parser.delegate = self; [parser parse:data]; parser.delegate = nil; parser = nil; 

YAJLParser代表:

 // first declare in header file NSMutableArray *stack and NSString *mapKey - (void)parserDidStartDictionary:(YAJLParser *)parser { NSString *dictName = mapKey; if (mapKey == nil) { dictName = (stack.count == 0) ? @"" : [stack lastObject]; } [stack addObject:(dictName)]; } - (void)parserDidEndDictionary:(YAJLParser *)parser { mapKey = nil; [stack removeLastObject]; } - (void)parserDidStartArray:(YAJLParser *)parser { NSString *arrayName = mapKey; if (mapKey == nil) { arrayName = stack.count == 0 ? @"" : [stack lastObject]; } [stack addObject:(arrayName)]; if([mapKey isEqualToString:@"something"]) { // do something } } - (void)parserDidEndArray:(YAJLParser *)parser { if([mapKey isEqualToString:@"some1"]) { // do something } mapKey = nil; [stack removeLastObject]; } - (void)parser:(YAJLParser *)parser didMapKey:(NSString *)key { mapKey = key; } - (void)parser:(YAJLParser *)parser didAdd:(id)value { if([mapKey isEqualToString:@"id"]) { // do something } } 

写你的数据到一个文件,然后使用NSData的dataWithContentsOfFile:options:error:并指定NSDataReadingMappedAlways和NSDataReadingUncached标志。 这将告诉系统使用mmap()来减less内存占用量,而不是使用内存块(这会使速度变慢,但对iOS的负担更小)给文件系统caching带来负担。

你可以在这里find答案iPad – parsing一个非常巨大的json – 文件(50和100 MB之间)