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];
    }
}

 

转载于:https://www.cnblogs.com/rooney-10/p/4210216.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值