NSXMLParser的parse方法是异步的吗?

10

NSXMLParser的parse方法是异步的吗?

换句话说,如果我有一个NSXMLParse对象,并从主线程调用[someParseObject parse],它会在执行期间阻塞主线程吗?

4个回答

18

它不是异步的,因此会阻塞主线程。


1

NSXMLParser可以解析URL/Data,但如果我们直接解析URL,它会冻结UI(主线程),因此您可以使用NSXMLParser进行数据解析。请查看NSURLConnection API以异步获取数据。


0

是的,它会阻塞。这里是我如何使用NSInvocationQueue来在解析时不阻塞UI线程...只需使用URL路径作为字符串调用beginParsing,它将处理其余部分:

-(void) beginParsing:(NSString*) path{
    if(path ==nil)
        return;

    NSOperationQueue *queue = [[NSOperationQueue new] autorelease];

    NSInvocationOperation *operation= [[[NSInvocationOperation alloc]
                                             initWithTarget: self
                                                   selector: @selector(createRequestToGetData:)
                                                     object: path]
                                       autorelease];

    [queue addOperation:operation];
}

-(void)createRequestToGetData:(NSString*)path
{
    NSURL* Url = [NSURL URLWithString:path];

    NSXMLParser* parser = [[NSXMLParser alloc] initWithContentsOfURL:Url];

    [parser setDelegate:self];

    NSLog(@"path is %@",path);
    [parser parse];

    [path release];
    [parser release];
}

你为什么要释放路径参数? - jcpennypincher

0

你可以像这样使用NSXMLParser作为异步操作

dispatch_async( dispatch_get_global_queue(0, 0), ^{

    NSString * dovizUrl=@"http://www.tcmb.gov.tr/kurlar/today.xml";
    NSURL *url = [NSURL URLWithString:dovizUrl];
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    xmlParser.delegate = self;
    // call the result handler block on the main queue (i.e. main thread)
    dispatch_async( dispatch_get_main_queue(), ^{
        // running synchronously on the main thread now -- call the handler
        [xmlParser parse];
    });
});

2
[xmlParser parse] 运行在主线程上并会阻塞它。你只需要异步初始化该方法。 - Philip Kramer
@PhilipKramarov所说的。 - nmdias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接