你的猜想是正确的。只有当程序控制返回到主运行循环时,才对用户界面进行更新。NSXMLParser
但是完全同步工作:该parse
方法解析整个 XML 数据(调用委托函数等)并仅在解析完成后返回。reloadData
因此,呼入没有立即可见的效果parser:didEndElement:...
。
如果解析您的 XML 数据确实需要太多时间,以至于您不能只reloadData
在parse
方法返回时调用,那么您必须将解析操作移至单独的线程:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[myParser parse];
});
dispatch_async
立即返回并在后台线程上完成解析。因此,委托方法也会在后台线程上调用。由于 UI 的更新只能在主线程上完成,您可以按照以下步骤进行
parser: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 更新。
我确实希望我的示例代码中没有太多的语法错误,并且它会有所帮助。否则随时问。