ios - 我怎样才能等到 NSXMLParserDelegate 方法完成?

标签 ios nsurlconnection nsxmlparser

我想用解析后的 xml 结果创建对象,但它总是返回 null。我认为它在 nsxmlparser 委托(delegate)未完成之前完成。

这是我的代码。

@interface ParserOperation () <NSXMLParserDelegate, NSURLConnectionDelegate> {
    NSString *soapResults;
    NSXMLParser *xmlParser;
    NSMutableData *responseData;
}

- (void)main {

    NSError *error;
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self];
    if (connection)
        responseData = [NSMutableData data];
    else
        NSLog(@"NSURLConnection initWithRequest: Failed to return a connection.");

    if ([self isCancelled]) {
        return;
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        if (error) {
            self.callbackBlock(NO, error);
            NSLog(@"error %@", error);
        } else {
            self.callbackBlock(YES, self.results);
            NSLog(@"else %@", soapResults);
        }
    });
}

XML 解析器在 NSURLConnection 委托(delegate)方法完成时开始。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

    NSLog(@"Completed, Received Bytes:%lu",(unsigned long)[responseData length]);

    xmlParser = [[NSXMLParser alloc] initWithData: responseData];
    xmlParser.delegate = self;
    [xmlParser setShouldResolveExternalEntities:YES];
    [xmlParser parse];
}

- (void)parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *)attributeDict {

    soapResults = [[NSString alloc] init];
}

- (void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string {
    soapResults = [soapResults stringByAppendingString:string];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:self.resultName]) {
        if ([soapResults isEqualToString:@""]) {
            NSLog(@"error");
        }
        else {
            NSData *jsonData = [soapResults dataUsingEncoding:NSUTF8StringEncoding];
            NSError *e;
            self.results = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&e];
            NSLog(@"Parsed Object: %@", self.results);
            NSLog(@"soap: %@", soapResults);
        }
    }
}

最佳答案

解析器是同步的,但下载不是。完成 block 的调用方法与开始下载的方法相同,因此它将始终在下载完成之前运行。

您应该仅在出现错误时调用该方法中的完成 block 。完成 block 应该在 [xmlParser parse]; 之后调用,因为这是成功处理数据的时间。

关于ios - 我怎样才能等到 NSXMLParserDelegate 方法完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25102927/

相关文章:

ios - 在 NSURLConnection 中委托(delegate)并声明变量 receiveData

iphone - NSXMLParser 分解元音符号 (ä, ö, ü)

html - Cordova/iOS - 链接样式不起作用 - 我必须如何更改我的代码

IOS/Objective-C/核心数据 : NSPredicates with Complicated Conditional logic

ios - SwiftUI - WKWebView 的 iOS 13 UIViewRepresentable 获得线程 1 : EXC_BREAKPOINT crash

ios - Swift:处理异步调用

ios - NSURLConnection connectionDidFinishLoading 未被随机调用

ios - 当服务器返回 'Moved temporarily' 或 'Moved permanently' 时,如何使用 NSURLConnection 获取重定向 URL?

iphone - NSXMLParser 问题 : don't get all data?

ios - 检查 Swift 中是否存在 XML 元素