我有一个 XML 解析器,当它启动时,它会使整个应用程序冻结直到完成,我使用以下方法调用解析器:
xmlParser = [[XMLParser alloc] loadXMLByURL:@"http://abdelelrafa.com/test2.xml"];
在不中断主线程的情况下让 XML 解析器工作的最佳方法是什么?我想知道使用另一个线程是最好的选择,还是使用别的东西。
我有一个 XML 解析器,当它启动时,它会使整个应用程序冻结直到完成,我使用以下方法调用解析器:
xmlParser = [[XMLParser alloc] loadXMLByURL:@"http://abdelelrafa.com/test2.xml"];
在不中断主线程的情况下让 XML 解析器工作的最佳方法是什么?我想知道使用另一个线程是最好的选择,还是使用别的东西。
如果您要使用initWithContentsOfURL
,您绝对应该在主线程之外完成工作,然后在获得初始化结果后重新回到主线程。
根据文档的大小,您可能会发现首先NSData
使用获取 URL 的内容会更好NSURLConnection
,它可以在不阻塞主线程的情况下完成工作,然后[XMLParser initWithData]
在获得数据后调用。这还有一个额外的好处,即您实际上可以将网络错误与 XML 错误分开处理。
尝试使用 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 元素或回调完成/失败