iOS - 延迟后的 UITableView reloadData

Posted

技术标签:

【中文标题】iOS - 延迟后的 UITableView reloadData【英文标题】:iOS - UITableView reloadData after delay 【发布时间】:2017-12-14 06:02:46 【问题描述】:

我正在尝试创建一个 UITablView 扩展函数以在一段时间延迟后重新加载表,例如:

extension UITableView 
    func reloadData(afterDelay delayTime: TimeInterval) -> Void 
        self.perform(#selector(self.reloadData), with: nil, afterDelay: delayTime)
    

但它向我显示了一个错误:Ambiguous use of 'reloadData'

它的正确解决方案是什么?

这是带有错误消息的快照

【问题讨论】:

将您的方法名称更改为其他名称,例如 reloadDataWithDelay 并检查 如果延迟的目的是等待某个异步任务不要这样做 @vadian,你是绝对正确的,我需要这个功能来达到同样的目的。我有一些动画操作,需要 tableview 等待几个时间间隔,以重新加载其数据。 【参考方案1】:

重命名您的函数,因为它与 UITableView 的 reloadData() 冲突

//---------
extension UITableView 

    // Default delay time = 0.5 seconds
    // Pass delay time interval, as a parameter argument
    func reloadDataAfterDelay(delayTime: TimeInterval = 0.5) -> Void 
        self.perform(#selector(self.reloadData), with: nil, afterDelay: delayTime)
    


【讨论】:

【参考方案2】:

我会使用块来解决这个问题,如下所示:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayTime)  [weak self] in
    self?.tableView.reloadData()

【讨论】:

【参考方案3】:
  extension UITableView 
    func reloadDataAfterDelay(delayTime: TimeInterval) -> Void 
    let when = DispatchTime.now() + delayTime
       DispatchQueue.main.asyncAfter(deadline: when) 
           self.reloadData()
       
    
  

【讨论】:

你会想要一个 [weak self] 在块的开头,否则这不会编译。 现在你已经删除了self? 这可能会导致内存泄漏【参考方案4】:

试试这个:

extension UITableView 
    func reloadDataWithDelay(delayTime: TimeInterval) -> Void 
        let delayTime = DispatchTime.now() + 2
        DispatchQueue.main.asyncAfter(deadline: delayTime) 
             self.reloadData()
        

    

【讨论】:

'reloadData' 与其默认方法冲突

以上是关于iOS - 延迟后的 UITableView reloadData的主要内容,如果未能解决你的问题,请参考以下文章

使用 Alamofire 在 UITableview 中延迟加载 API 请求

在具有滚动索引的 UITableView 中延迟加载图像

iOS 应用安装后的深层链接(延迟深层链接)

ios - UITableView 滞后于多个部分

endUpdates 后的 UITableView 部分页脚视图位置

iOS开发中didSelectRowAtIndexPath tap事件响应延迟