IOS8下NSXMLParser does not support reentrant parsing报错问题解决

某天,在ios8.1下运行了一个之前没有问题的老项目,登录的时候出现了:NSXMLParser does not support reentrant parsing。

直接翻译成中文,系统的xml解析不支持折返解析,不理解!于是开始写demo测试问题。

因为此项目登录接口将2份用途不同的数据合并在同一个接口返回,代码中对此xml数据解析了2次,所以首先模拟对一份数据进行多次解析的情况

1、demo1,在同一个函数中,调用2次xml解析代码

    NSString *xmlStr = @"<test><goods>asdf</goods><goods>asdf</goods></test>";
    NSData *xmlData = [xmlStr dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    NSXMLParser * parser = [[NSXMLParser alloc] initWithData:xmlData];
    parser.delegate = self;
    [parser parse];
    NSXMLParser * parser1 = [[NSXMLParser alloc] initWithData:xmlData];
    parser1.delegate = self;
    [parser1 parse];

run后发现运行正常,并未出现报错。再研究下老项目的代码,发现老项目中首先对xml数据是否登录成功进行了一次解析,并在解析成功后调用的block中,再进行了另一次解析获取另一份数据,那么模拟之

2、demo2,在xml解析的delegate回调中,再进行xml解析

- (void)btnPublishOnClick
{
    NSString *xmlStr = @"<test><goods>asdf</goods><goods>asdf</goods></test>";
    NSData *xmlData = [xmlStr dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    NSXMLParser * parser = [[NSXMLParser alloc] initWithData:xmlData];
    parser.delegate = self;
    self.curParserType = @"first";
    [parser parse];
    return;
}

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSString *xmlStr = @"<test><goods>asdf</goods><goods>asdf</goods></test>";
    NSData *xmlData = [xmlStr dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    if ([self.curParserType isEqualToString:@"first"]) {
        NSXMLParser * parser1 = [[NSXMLParser alloc] initWithData:xmlData];
        self.curParserType = @"second";
        parser1.delegate = self;
        [parser1 parse];
    }
}

果然,运行后,出现NSXMLParser does not support reentrant parsing的报错,那么可以得出以下结论:

在xml解析的delegate回调中(如:parserDidEndDocument),进行二次xml解析,就会出现NSXMLParser does not support reentrant parsing的报错

解决办法:

1、开线程,将二次解析xml的代码放在线程中执行

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSString *xmlStr = @"<test><goods>asdf</goods><goods>asdf</goods></test>";
    NSData *xmlData = [xmlStr dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    if ([self.curParserType isEqualToString:@"first"]) {
        dispatch_queue_t reentrantAvoidanceQueue = dispatch_queue_create("reentrantAvoidanceQueue", DISPATCH_QUEUE_SERIAL);
        dispatch_async(reentrantAvoidanceQueue, ^{
            NSXMLParser * parser1 = [[NSXMLParser alloc] initWithData:xmlData];
            self.curParserType = @"second";
            parser1.delegate = self;
            [parser1 parse];
        });
        dispatch_sync(reentrantAvoidanceQueue, ^{ });
    }
}

2、使用performSelector,将二次解析xml的代码延迟执行

- (void)sencondParser:(NSData *)xmlData {
    NSXMLParser * parser1 = [[NSXMLParser alloc] initWithData:xmlData];
    self.curParserType = @"second";
    parser1.delegate = self;
    [parser1 parse];
}

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSString *xmlStr = @"<test><goods>asdf</goods><goods>asdf</goods></test>";
    NSData *xmlData = [xmlStr dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    if ([self.curParserType isEqualToString:@"first"]) {
        [self performSelector:@selector(sencondParser:) withObject:xmlData afterDelay:0.1];
    }
}
时间: 2024-12-04 22:58:59

IOS8下NSXMLParser does not support reentrant parsing报错问题解决的相关文章

android studio :com.android.support:appcompat-v7:21.+ 报错

android studio :com.android.support:appcompat-v7:21.+ 报错: 在project——>app——>build.gradle修改: apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.example.ri

windows7旗舰版64位下安装、破解及运行QTP11报错

说明:如果你出现了以下几种情况,希望能解决你的问题:如果没有,就当路过. 1.安装qtp11时报vc++ 2005缺少,但怎么也不能成功安装 解决方法: 1.找到qtp安装包里面的vc++ 2005组件 QuickTest\CHS\prerequisites\vc2005_sp1_redist. 2.运行vcredist_x86.exe文件,如果安装失败,修改后缀名为压缩文件,如:zip.rar,解压文件后重新运行解压后的文件. 2.网上介绍用mgn-mqt82.exe的方法破解qtp11失败

Windows下使用pip安装python包是报错-UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xcb in position 0

先交待下开发环境: 操作系统:Windows 7 Python版本:2.7.9 Pip版本:6.1.1 其他环境忽略 在windows下使用pip下载python包,出现如下错误 [plain] view plain copy Collecting xxxxxx Exception: Traceback (most recent call last): File "D:\Python27\lib\site-packages\pip-6.0.8-py2.7.egg\pip\basecommand.

tomcat下部署了多个项目启动报错java web error:Choose unique values for the &#39;webAppRootKey&#39; context-param in your web.xml files

应该是tomcat下部署了多个项目且都使用log4j. <!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的"webapp.root".但最好设置,以免项目之间的名称冲突. 定义以后,在Web Container启动时将把ROOT的绝对路径写到系统变量里. 然后log4j的配置文件里就可以用${webName.root }来表示Web目录的绝对路径,把log文件存放于webapp中. 此参数用于后面的“Log4jConfigListener”

Linux下编译C代码,出现tan函数报错的情况

undefined reference to `tan' 但是已经包含了头文件 <math.h>了,可还是报错,说是找不到tan 这个问题的原因不是很清楚, 但是网上给出的方案,就是编译的时候 加上参数 -lm 有说l表示Lib ,m表示 math.h  , ****************************************************************************************************** 以下是一些说明 使用math.h

linux centos环境下,perl使用DBD::Oracle遇到报错Can&#39;t locate DBDOracle.pm in @INC 的解决办法

前言 接手前辈的项目,没有接触.安装.使用过perl和DBD::Oracle,也没有相关的文档记录,茫茫然不知所措~~.一开始发现这个问题,就想着迅速解决,就直接在google上搜报错信息,搜索的过程中发现 如果不搞清楚前因后果我连解决方案都'看不见''看不懂'. 所以还是要补充这方面的知识,再思考解决方案.以下内容就是我一边学习一边解决问题的过程,如果不足,请各位大佬指出. 报错 install_driver(Oracle) failed: Can't locate DBD/Oracle.pm

Eclipse下Maven新建Web项目index.jsp报错完美解决(war包)

Eclipse下Maven新建Web项目步骤 1. 2. 3. 4. 5. 问题描述 最近用eclipse新建了一个maven项目,结果刚新建完成index.jsp页面就报错了,先把错误信息贴出来看看! 解决方法 第一种:直接在pom.xml文件中添加jar包支持 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <

Ubuntu下安装了java但启动eclipse报错说没装java

参考资料:http://blog.csdn.net/happyteafriends/article/details/8290950 一.问题 在Ubuntu下安装了java并在~/.bashrc配置了环境变量,在终端可运行java等命令,但启动eclipse报错说缺少jre或jdk: ”a java runtime environment jre or java development kit jdk....“ 二.解决 在在/etc/environment里补充上jdk bin的路径即可. 三

centos7下启动不了mysql或者mariadb报错

centos7 系统中编译安装mysql或者mariab启动不了服务 报错 错误如下:Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details. 解决方法: 根据提示,分别使用systemctl status mysqld