【问题标题】:Progress HUD is not shown before parsing XML在解析 XML 之前不显示进度 HUD
【发布时间】:2012-08-10 20:28:15
【问题描述】:

我实际上使用NSXMLParser 类来解析服务器上托管的XML 文件。 当解析器在做他的工作时,我想展示 HUD 在那里抓取的进度:https://github.com/jdg/MBProgressHUD

这是我显示进度 HUD 的方式:

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:NO];
hud.labelText = @"Update"; 

然后我使用我创建的类启动解析器:

[dm parseXMLAtURL:[NSURL URLWithString:@"myXML.xml.php"]];

这是完整的类方法:

- (void)parseXMLAtURL:(NSURL *)XMLUrl {
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:XMLUrl];
    [parser setDelegate:self];
    NSLog(@"start");
    [parser parse];    
}

我在解析 XML 之前显然调用了MBProgressHUD,但没有办法:当解析器完成工作时会显示MBProgressHUD

我认为这个问题可能是由于堆栈管理,当他在其他人之前完成最长的工作时(解析完整的 XML 需要大约 6-7 秒)我是对的还是可能是另一回事?如果我是对的,我该如何管理?

【问题讨论】:

    标签: iphone ios stack nsxmlparser mbprogresshud


    【解决方案1】:

    你说得对,它与时间有关。因为一切都是在同一个线程上完成的。 只需将 XML 的解析延迟几毫秒:

    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:NO];
    hud.labelText = @"Update"; 
    [dm performSelector:@selector(parseXMLAtURL:)  withObject:[NSURL URLWithString:@"myXML.xml.php"] afterDelay:0.1f];
    

    不如在新线程上运行 XML 解析,但它会工作。

    【讨论】:

    • 效果很好,如果我无法使用 Klaus 的解决方案(使用不同的线程),我会保留它(使用不同的线程)谢谢您的快速回答
    • 这是一个关于iOS处理和UI更新的一般命题,如果你在一个事件循环中并且两件事必须或多或少地同时发生,performSelector..延迟完成开始 UI 更新之前的事件循环(反之亦然)总是一个好主意。为您需要的正确答案。在这种情况下,无论哪种方式,UI 都会被阻止,因此更完整的多线程不会给您带来很多好处。
    【解决方案2】:

    从您发布的代码中我无法确定,但很可能是因为 XML 解析器阻塞了您的主线程。

    要修复它,请使用dispatch_async 或类似方法将您的 XML 解析生成到另一个线程。这也在 HUD 自述文件中的用法下进行了说明。

    问候

    【讨论】:

    • 我去看看dispatch_async谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多