gpt4 book ai didi

ios - 没有立即调用 reloadData(NSXMLParserDelegate 困境)

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:19:21 28 4
gpt4 key购买 nike

我继承了一些我正在尝试调试的该死的糟糕代码。

我正在使用 NSXMLParser 解析 RSS 提要。在 parser:didEndElement:etc: 中,随着每个新项目的出现,我触发另一个调用 UITableView 的 reloadData 方法的方法。但是,调用 reloadData 方法时并没有调用它们,而是稍后...在 parserDidEndDocument: ... 之后它们会同时触发。

似乎 reloadData 请求在某处排队,阻塞在解析线程上。

我怎样才能强制 reloadData 在我告诉它时触发,而不是在它想要的时候触发。我的问题是,由于它只在所有新闻项都已加载后才重新加载——而且有很多新闻项——UI 体验不是最佳的。

最佳答案

你的猜测是正确的。只有当程序控制返回到主运行循环时,才会对用户界面进行更新。 NSXMLParser 然而完全同步工作:parse 方法解析整个 XML 数据(调用委托(delegate)函数等)并仅在解析完成时返回。因此,在 parser:didEndElement:... 中调用 reloadData 没有立即可见的效果。

如果解析 XML 数据真的花费太多时间以至于当 parse 方法返回时您不能调用 reloadData,您必须将解析操作移到一个单独的主题:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[myParser parse];
});

dispatch_async 立即返回并在后台线程上完成解析。因此,委托(delegate)方法也会在后台线程上调用。由于对 UI 的更新只能在主线程上完成,您可以在解析器:didEndElement:...:

YourType newObject = ... // create new object from XML data
dispatch_async(dispatch_get_main_queue(), ^{
// assuming that self.dataArray is your data source array for the table view
int newRow = [self.dataArray count]; // row number for new object
[self.dataArray addObject:newObject]; // add to your data source
// insert row in table view:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:newRow inSection:0];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
});

使用 insertRowsAtIndexPaths 而不是 reloadData 应该可以通过动画提供“更流畅”的 UI 更新。

我确实希望我的示例代码中没有太多语法错误并且它会有所帮助。否则请随时询问。

关于ios - 没有立即调用 reloadData(NSXMLParserDelegate 困境),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12831896/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com