2014-09-05 41 views
0

我目前有一个关于块的问题,它自己从XML文档加载报告的应用程序。解析器的工作原理,但我有一个问题,当它加载到mainArray和块重新加载完成后的数据。我已尝试使用信号量在流程结束时关闭事件。但是因为XML在加载时速度不是很快,所以mainArray被填充并且UITableView的数据被重新加载。我目前正在使用:等待块完成重新加载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 feed到[xml parsedArray];特别是TBXML + HTTP.h & .m文件来获取数据。

+0

尝试使用XmlParser委托方法。 – 2014-09-05 08:26:29

+0

我忘记提及我正在使用TBXML加载XML提要。 – TinMan7757 2014-09-05 08:27:42

+0

'XmlParser'是否以异步方式工作? – KudoCC 2014-09-05 08:28:53

回答

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]; 

    }); 
}); 
0

另一种方式可能是如下: - 。

  1. 创建一个线程在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]; 
    } 

希望有帮助到u!