仅在 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
中调用 reloadData
和 methodB
。
@MartinR - 你搞定了马丁 - 我在这里修改了问题。此问题之前已关闭,但已重新组织。请随时重新打开并提供您的答案,我将标记为正确。你为我节省了大量时间!! ***.com/questions/15217522/…【参考方案2】:
问题是您在启动 URL 请求后立即调用reloadData
。这没有意义,因为此时请求尚未完成。
正确的方法是在使用 URL 请求的响应更新数据源后,在 connectionDidFinishLoading
中调用 reloadData
和 methodB
。此时您就知道行数是否为零,并且无需等待表格视图更新完成。
【讨论】:
【参考方案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 上刷新