0

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

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

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

4

2 回答 2

1

如果您要使用initWithContentsOfURL,您绝对应该在主线程之外完成工作,然后在获得初始化结果后重新回到主线程。

根据文档的大小,您可能会发现首先NSData使用获取 URL 的内容会更好NSURLConnection,它可以在不阻塞主线程的情况下完成工作,然后[XMLParser initWithData]在获得数据后调用。这还有一个额外的好处,即您实际上可以将网络错误与 XML 错误分开处理。

于 2013-11-15T02:41:06.903 回答
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
    });
});

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

于 2013-11-15T02:58:35.307 回答