加载大xml文件

时间:2014-08-01 09:07:48

标签: objective-c nsurlconnection

我正在尝试从服务器加载大文件,但是当它加载时总是很慢。 你能建议我方法,如何快速加载,然后200k对象?

Printing description of data:
(NSData *) data = 0x08e51d80 151341098 bytes

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
    if (error)
    {
        NSLog(@"Error,%@", [error localizedDescription]);
    }
    else
    {
        NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);
    }
}];

2 个答案:

答案 0 :(得分:0)

切换到JSON。 JSON将比XML更快地加载和解析MUCH。我有一个1.8 MB的JSON文件,它在大约7秒内下载并解析(我使用AFNetworking进行连接)。另一个提示,将生成的NSArray缓存在设备上,以便下次可以直接从该缓存的数组加载,并在后台再次请求该文件并与缓存的数组进行比较。如果不同,请使用新数据更新模型。

这样的事情:

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    if (!error) {
        NSError *error = nil;
            id jsonObj = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
        }
    }
    else {
        NSLog(@"Error,%@", [error localizedDescription]);
    }
}];

答案 1 :(得分:0)

两点:

  1. 您可以将文件输出流用于网络请求,而不是将整个NSData保留在内存中。例如,AFNetworking支持此类选项。
  2. 您可以使用具有流支持的SAX解析器来对文件中的数据进行反序列化,从而避免将整个XML加载到内存中。例如,NSXMLParser支持流解析。
  3. 以下是设置NSXMLParser的示例:

    NSInputStream *fileStream = [NSInputStream inputStreamWithURL:temporaryXMLFileURL];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithStream:fileStream];
    parser.delegate = yourParserDelegate;
    BOOL result = [parser parse];
    

    您可以实现解析&采用NSXMLParserDelegate的类中的对象实例化代码,互联网上有很多例子,甚至来自Apple的one

    请注意,所有这些技巧都不会加速从互联网上下载大文件,这完全取决于您的连接速度。我的方法只会有助于减少应用程序内存占用(从而降低因内存压力而导致应用程序被iOS抛弃的风险)。