首页 > 解决方案 > 如何更改 DispatchQueue 中对象的延迟时间

问题描述

我有一个 tableView,其中单元格出现一定延迟。延迟取决于每个单元格的文本中有多少个字母。所以我的问题是如果用户做某事(例如向下滚动tableView),是否有一种方法可以改变延迟时间。

理想情况下,如果向下滚动 tableView,我希望下一个单元格完全没有延迟地出现。

我想答案在某处DispatchQueue.main.async(execute: task)。虽然我不确定它是只执行下一个排队的任务还是队列中的所有任务。(显然我只需要下一个任务)。无论如何,我的应用程序下面的代码崩溃了。

var task: DispatchWorkItem?
var lastContentOffset: CGFloat = 0

//Checking if tableView was scrolled.

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
   if lastContentOffset < scrollView.contentOffset.y {
        print("Table view scrolled-down!")
        DispatchQueue.main.async(execute: task!)
   }
   else{
        print("Scrolled up")
   }
}

//Updating my tableView with delay

func updateTableView(nextPassageID: Int) {

    task = DispatchWorkItem {
         self.numberOfCells += 1
         let indexPath = IndexPath(row: nextPassageID, section: 0)
         self.tableView.insertRows(at: [indexPath], with: .fade)
    }

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delay, execute: task!)
}

任何帮助将不胜感激。干杯!

标签: iosswiftgrand-central-dispatch

解决方案


如何更改对象的延迟时间DispatchQueue

归根结底,你没有。如果您希望它比以前计划的更早开始,只需cancel它和调度创建一个新的,而不会有任何延迟。

或者,您可以使用 a Timer,您可以安排它,但也可以fire在预定的触发日期发生之前运行它,然后运行invalidate它。

请注意强参考周期。例如,在您的闭包中(无论是DispatchWorkItem基于闭包的计时器,请考虑使用[weak self]捕获列表,以便闭包不会保持对 的强引用self。同样,如果您的DispatchWorkItemor有一个 ivar,请Timer考虑(a)使用本地var 为项目/计时器,(b)将其添加到您的队列/运行循环,然后(c)使您的 ivar 成为weak引用,以便当项目运行和/或计时器触发时,您的 ivar 将被自动释放,避免挂在超出其使用寿命的参考资料上。


推荐阅读