ios - 如何更改 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!)
}
任何帮助将不胜感激。干杯!
解决方案
如何更改对象的延迟时间
DispatchQueue
归根结底,你没有。如果您希望它比以前计划的更早开始,只需cancel
它和调度创建一个新的,而不会有任何延迟。
或者,您可以使用 a Timer
,您可以安排它,但也可以fire
在预定的触发日期发生之前运行它,然后运行invalidate
它。
请注意强参考周期。例如,在您的闭包中(无论是DispatchWorkItem
基于闭包的计时器,请考虑使用[weak self]
捕获列表,以便闭包不会保持对 的强引用self
。同样,如果您的DispatchWorkItem
or有一个 ivar,请Timer
考虑(a)使用本地var 为项目/计时器,(b)将其添加到您的队列/运行循环,然后(c)使您的 ivar 成为weak
引用,以便当项目运行和/或计时器触发时,您的 ivar 将被自动释放,避免挂在超出其使用寿命的参考资料上。
推荐阅读
- php - URL 不解码消息
- cron - wg-quick up 在从 crontab 运行时抛出“名称解析中的临时失败”,但在从 shell 运行时工作正常
- python - 基于另一个图形创建一个图形
- apache-camel - Apache camel - 如何检索给定组件的端点 URI
- python - Numpy 基于行索引沿轴应用
- flutter - future 方法在 null - flutter 中被调用
- c++ - 使用 reinterpret_cast 通过引用传递值
- terraform - 运行 EMR 作业流程时出错:ValidationException
- web-scraping - Python 从网络标头请求 403 Forbidden referer
- docker - 如何在 Host 模式下使用服务名访问容器?