仅在 reloadData 完成后调用函数

Posted

技术标签:

【中文标题】仅在 reloadData 完成后调用函数【英文标题】:Call function only after reloadData has finished 【发布时间】: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];


【问题讨论】:

***.com/questions/4163579/… 感谢@Anil - 我实际上已经尝试过了,但即使没有返回结果也需要触发该方法。实际上,只有在没有返回结果的情况下,我才需要它触发。如果 tableView 为空,则不会触发该帖子中的答案。 请注意,initWithRequest 仅启动异步操作。您应该在connectionDidFinishLoading 中致电reloadData - 然后您就知道是否有结果! 我错过了什么吗? reloadData 是同步的,不是吗? @CarlVeazey:是的,这就是我不明白答案的原因。 【参考方案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 - 你搞定了马丁 - 我在这里修改了问题。此问题之前已关闭,但已重新组织。请随时重新打开并提供您的答案,我将标记为正确。你为我节省了大量时间!! ***.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.
        ];

【讨论】:

以上是关于仅在 reloadData 完成后调用函数的主要内容,如果未能解决你的问题,请参考以下文章

JQuery:如何仅在完成调整大小后才调用 RESIZE 事件?

循环函数中的异步调用。仅在异步完成时返回

调用函数reloadData时如何对UITableView进行swap效果

CollectionView 仅在 SVPullToRefresh 上刷新,不在 .reloadData 上刷新

iOS swift UITableView ReloadData 性能

Apollo 客户端 writeQuery 更新存储,但 UI 组件仅在第二次函数调用后更新