我目前遇到有关块的问题,它自己正在从XML文档加载报告的应用程序。然而,解析器工作时将它加载到mainArray并在块完成后重新加载数据时遇到问题。我尝试使用信号量在进程完成时关闭事件。但是因为加载时XML不是很快,所以将填充mainArray并重新加载UITableView的数据。我目前正在使用这个:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, kNilOptions), ^{
XmlParser *xml = [[XmlParser alloc]init];
NSURL *url = [NSURL URLWithString:kStaticURL];
[xml loadXML:url];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(),^{
mainArray = [xml parsedArray];
[UiTableView reloadData];
});
});
然后,这将正确填充数组并从对象中加载我想要的内容。 我如何获得此代码:
mainArray = [xml parsedArray];
[UiTableView reloadData];
在
之后执行 XmlParser *xml = [[XmlParser alloc]init];
NSURL *url = [NSURL URLWithString:kStaticURL];
[xml loadXML:url];
提前致谢。
编辑:我正在使用TBXML将XML提要解析为[xml parsedArray];特别是TBXML + HTTP.h& .m文件来获取数据。
答案 0 :(得分:5)
我认为你只需要将dispatch_after更改为dispatch_async(dispatch_get_main_queue(), 在xml解析完成之前不应该执行。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
XmlParser *xml = [[XmlParser alloc]init];
NSURL *url = [NSURL URLWithString:kStaticURL];
[xml loadXML:url];
}
dispatch_async(dispatch_get_main_queue(), ^{
mainArray = [xml parsedArray];
[UiTableView reloadData];
});
});
答案 1 :(得分:0)
另一种方式如下: -
创建一个线程,以便在viewDidload或您想要的任何地方执行以下方法。
[NSThread detachNewThreadSelector:@selector(readXML) toTarget:self withObject:nil]; //this way ur main thread won't be blocked and reading of xml will be done in background thread.
然后,
-(void)readXML
{
XmlParser *xml = [[XmlParser alloc]init];
NSURL *url = [NSURL URLWithString:kStaticURL];
[xml loadXML:url];
[self performSelectorOnMainThread:@selector(reloadTableWithXML) withObject:nil waitUntilDone:NO]; //to update on main thread.
}
-(void)reloadTableWithXML
{
mainArray = [xml parsedArray];
[UiTableView reloadData];
}
希望对你有所帮助!