【发布时间】:2018-12-02 20:55:58
【问题描述】:
我想知道是否可以在保持“.asyncAfter”时间的同时暂停然后恢复主队列上的工作项。如果没有,是否有解决方法来实现这一点?
在某个时刻,我将以下 DispatchWorkItem 排队:
dispatchWorkItem = DispatchWorkItem(qos: .userInteractive, block: {
self.view.backgroundColor = UIColor.workoutBackgroundColor
self.runTimer()
self.timerButton.animateableTrackLayer.removeAnimation(forKey: "strokeEndAnimation")
self.isRestState = false
})
我使用:
DispatchQueue.main.asyncAfter(deadline: delayTime, execute: self.dispatchWorkItem))
(delayTime 是函数的参数)
现在,我遇到的问题是,如果用户在我的应用中执行“暂停”操作,我该如何暂停此工作项。
我已尝试使用DispatchQueue.main.suspend() 方法,但工作项在指定的延迟时间后继续执行。根据我的阅读,这个方法应该挂起队列和这个排队的工作项,因为它没有被执行。 (如果我错了,请纠正我!)
我需要实现的是工作项“暂停”,直到用户在应用程序中执行“恢复”操作,这将从延迟时间停止的地方恢复工作项。
这适用于我在不需要更新 UI 时创建的后台队列;但是,在主队列上似乎动摇了。
我考虑过的一种解决方法是,当用户执行暂停操作时,存储直到工作项将要执行的剩余时间,并在恢复操作的那个时间将工作项重新添加到队列中。这似乎是一种质量较差的方法,我觉得有一种更合适的方法。
在这方面,是否可以创建一个后台队列,在执行时执行主队列上的工作项?
提前致谢!
【问题讨论】:
-
@matt 我正在使用“asyncAfter”方法,该方法允许代码和用户与应用程序的交互继续进行,直到工作项被执行,当它被执行时,用户将无法执行暂停行动。
-
stackoverflow.com/questions/29492707/… 的可能副本,其中明确表示您不能挂起不属于您的队列(主队列也不是您的)。
标签: swift grand-central-dispatch