我有一个XML Parser,当它启动时会使整个应用程序冻结直到它完成,我使用以下方法调用解析器:
xmlParser = [[XMLParser alloc] loadXMLByURL:@"http://abdelelrafa.com/test2.xml"];
在不中断主线程的情况下让XML解析器工作的最佳方法是什么? 我想知道使用另一个线程是最好的选择,还是使用别的东西。
答案 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元素或回调完成/失败