XML Parser阻止主线程

时间:2013-11-15 02:26:30

标签: ios xml multithreading

我有一个XML Parser,当它启动时会使整个应用程序冻结直到它完成,我使用以下方法调用解析器:

xmlParser = [[XMLParser alloc] loadXMLByURL:@"http://abdelelrafa.com/test2.xml"];

在不中断主线程的情况下让XML解析器工作的最佳方法是什么? 我想知道使用另一个线程是最好的选择,还是使用别的东西。

2 个答案:

答案 0 :(得分:1)

如果您要使用initWithContentsOfURL,您肯定应该从主线程开始工作,然后在获得init结果后重新选择主线程。

根据文档的大小,您可能会发现最好先使用NSData将URL的内容设为NSURLConnection,这样可以在不阻塞主线程的情况下完成其工作,然后获得数据后调用[XMLParser initWithData]。这样做的另一个好处是,您可以实际处理与XML错误分开的网络错误。

答案 1 :(得分:1)

尝试使用GCD为您执行此操作:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    xmlParser = [[XMLParser alloc] loadXMLByURL:@"http://abdelelrafa.com/test2.xml"];
    dispatch_async(dispatch_get_main_queue(), ^{
       // Update UI
    });
});

在新队列中输入dispatch_async,在此块中执行所有巡视网络操作/ xml解析,然后在主队列上创建另一个dispatch_async,以便您可以更新UI元素或回调完成/失败