Swift:禁用UIRefreshControl触发时TableView的默认重载行为
解决UIRefreshControl触发时禁用TableView默认重载的问题
嘿,我来帮你理清楚这个问题:其实UIRefreshControl本身触发时并不会自动调用TableView的reloadData(),它只会执行你绑定的getTableViewData方法。你要实现的核心是完全掌控TableView的刷新时机——等所有API请求完成、数据准备好之后,再手动刷新TableView,同时正确结束刷新控件的动画。
下面是具体的实现方案:
1. 用调度组管理多个API请求
因为你有多个API请求要处理,推荐用DispatchGroup来同步所有请求的完成状态,确保只有当所有数据都获取并处理完毕后,才刷新TableView。
2. 完整示例代码
@objc func getTableViewData() { // 初始化调度组,用来追踪多个API请求的完成状态 let dataFetchGroup = DispatchGroup() // 第一个API请求 dataFetchGroup.enter() YourAPIClient.fetchCoreDataSet1 { [weak self] result in defer { dataFetchGroup.leave() } // 无论成功失败,都标记该请求完成 switch result { case .success(let data): // 更新对应的数据源 self?.dataSourceSet1 = data case .failure(let error): print("获取第一组数据失败:\(error.localizedDescription)") } } // 第二个API请求 dataFetchGroup.enter() YourAPIClient.fetchCoreDataSet2 { [weak self] result in defer { dataFetchGroup.leave() } switch result { case .success(let data): self?.dataSourceSet2 = data case .failure(let error): print("获取第二组数据失败:\(error.localizedDescription)") } } // 所有API请求完成后,统一执行TableView刷新和结束刷新控件 dataFetchGroup.notify(queue: .main) { [weak self] in guard let self = self else { return } // 手动刷新TableView,这是唯一触发重载的时机 self.tableView.reloadData() // 结束刷新控件的动画,避免一直显示加载状态 self.refreshControl.endRefreshing() } }
3. 关键注意点
- 绝对不要在
getTableViewData方法的开头或者单个API请求的回调里直接调用tableView.reloadData(),这样会导致TableView在数据不全的情况下提前重载。 - 务必记得调用
refreshControl.endRefreshing(),否则刷新控件会一直保持加载动画状态,影响用户体验。 - 如果发现TableView还是有意外的重载行为,检查一下是否有其他地方(比如数据源的KVO监听、自动绑定的回调)触发了
reloadData(),确保这些逻辑也只在所有数据准备好后执行。
内容的提问来源于stack exchange,提问作者Bubu
相关产品推荐
相关产品推荐

