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

时间:2019-09-29 23:07:54

标签: ios swift grand-central-dispatch

我有一个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!)
}

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

1 个答案:

答案 0 :(得分:1)

  

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

底线,您没有。如果您希望它比以前计划的要早启动,只需cancel,然后立即分配一个新的创建器即可。

或者,您可以使用Timer,您可以对其进行计划,也可以使用fire,在计划的触发日期发生之前,它将运行它,然后invalidate

请小心参考周期强。例如,在您的闭包(无论是DispatchWorkItem还是基于闭包的计时器中,请考虑使用[weak self]捕获列表,这样闭包就不会维护对self的强烈引用。您在DispatchWorkItemTimer上有一个ivar,请考虑(a)为项目/计时器使用本地变量,(b)将其添加到队列/ runloop,然后(c)使ivar是一个weak引用,因此当该项目运行和/或计时器启动时,您的ivar将自动释放,避免挂在引用的使用寿命之外。

相关问题