【问题标题】:Call function only after reloadData has finished仅在 reloadData 完成后调用函数
【发布时间】:2013-03-05 08:17:38
【问题描述】:

我有一个tableView,需要在重新加载tableView 后执行一项功能。我如何知道reloadData 是否已完成?假设我有填充tableView 的methodA,一旦[tableView1 reloadData] 完成,我想调用methodB。谁能帮我这个?我一直在寻找几个小时...谢谢!

- (void) methodA
{

    NSString *URLa = [NSString stringWithFormat:@"http://www.website.com/page.php?
    v1=%@&v2=%@&v3=%@",v1, v2, v3];

    NSURL *url = [NSURL URLa];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    (void) [[NSURLConnection alloc] initWithRequest:request delegate:self];

    [tableView1 reloadData];

}

【问题讨论】:

  • 感谢@Anil - 我实际上已经尝试过了,但即使没有返回结果也需要触发该方法。实际上,只有在没有返回结果的情况下,我才需要它触发。如果 tableView 为空,则不会触发该帖子中的答案。
  • 请注意,initWithRequest 仅启动异步操作。您应该在connectionDidFinishLoading 中致电reloadData - 然后您就知道是否有结果!
  • 我错过了什么吗? reloadData 是同步的,不是吗?
  • @CarlVeazey:是的,这就是我不明白答案的原因。

标签: iphone ios objective-c xcode


【解决方案1】:

您可以在 UITableView 甚至子类 UITableView 上添加方法/类别:

-(void)reloadDataAndWait:(void(^)(void))waitBlock {
    [self reloadData];//if subclassed then super. else use [self.tableView
    if(waitBlock){
        waitBlock();
    }
}

你需要把它当作

[self.tableView reloadDataAndWait:^{
    //call the required method here                                            
}];

【讨论】:

  • 嗨 Anoop,看起来是一个非常有趣的方法,但我不知道如何实现它。你还有什么方向吗?
  • 很抱歉,我看不出这有什么用处。调用[self.tableView reloadDataAndWait:^{ [self methodB] }]; 与按顺序调用[self.tableView reloadData]; [self methodB]; 相同。 - 如果您在后台线程上调用reloadData 会有所不同,但这是不允许的。
  • @AnoopVaidya:[self.tableView reloadData]; [self methodB];[self.tableView reloadDataAndWait:^{ [self methodB] }]; 之间没有区别。 - reloadData 总是快速返回,可见单元格的实际更新是异步完成的。 - 如果你的回答对 Brandon 有帮助,那也没关系,但我真的不知道如何。
  • @Brandon:我认为真正的问题是您在启动 URL 请求后立即调用 reloadData。这没有意义,因为此时请求尚未完成。 - 在使用 URL 请求的响应更新数据源之后,正确的方法是在 connectionDidFinishLoading 中调用 reloadDatamethodB
  • @MartinR - 你搞定了马丁 - 我在这里修改了问题。此问题之前已关闭,但已重新组织。请随时重新打开并提供您的答案,我将标记为正确。你为我节省了大量时间!! stackoverflow.com/questions/15217522/…
【解决方案2】:

问题是您在启动 URL 请求后立即调用reloadData。这没有意义,因为此时请求尚未完成。

正确的方法是在使用 URL 请求的响应更新数据源后,在 connectionDidFinishLoading 中调用 reloadDatamethodB。此时您就知道行数是否为零,并且无需等待表格视图更新完成。

【讨论】:

    【解决方案3】:

    一旦我从服务器获取我的表的更新数据。

    当表格重新加载完成时,我使用以下代码片段来隐藏进度条。

    [UIView animateWithDuration:0 animations:^{
                [your_table_view reloadData];
            } completion:^(BOOL finished)
            {
                //Table reload completed TODO here
                //Hide progress bar etc.
            }];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多