等待块完成重新加载UITableView数据

时间:2014-09-05 08:24:01

标签: ios objective-c uitableview ios7 objective-c-blocks

我目前遇到有关块的问题,它自己正在从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文件来获取数据。

2 个答案:

答案 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)

另一种方式如下: -

  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.
    
  2. 然后,

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

    希望对你有所帮助!