如何在swift中停止dispatchQueue
我有一个introViewController的DispatchQueue,它显示gif 11秒,然后显示我的登录页面。。。但也有一个按钮,跳过介绍和显示登录。当我点击它时,时间仍在运行,当我在应用程序中导航时,时间结束时返回登录 这是我的课如何在swift中停止dispatchQueue,swift,dispatch-queue,Swift,Dispatch Queue,我有一个introViewController的DispatchQueue,它显示gif 11秒,然后显示我的登录页面。。。但也有一个按钮,跳过介绍和显示登录。当我点击它时,时间仍在运行,当我在应用程序中导航时,时间结束时返回登录 这是我的课 class GifClass: UIViewController { @IBOutlet weak var gifImage: UIImageView! @IBOutlet weak var skipButton: UIButton! overrid
class GifClass: UIViewController {
@IBOutlet weak var gifImage: UIImageView!
@IBOutlet weak var skipButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
gifImage.loadGif(name: "promed")
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(11)) {
self.performSegue(withIdentifier: "introLogin", sender: self)
}
}
@IBAction func skip(_ sender: Any) {
performSegue(withIdentifier: "introLogin", sender: self)
}
}
单击按钮时如何停止时间?您不会停止队列。相反,当您分派的任务开始执行时,它需要检查其上下文,如果上下文已更改,则需要执行正确的操作(通常为:无操作) 为此,您可以使用
DispatchWorkItem
。以下是参考资料:
下面是一个如何在代码中使用它的示例:
class GifClass: UIViewController {
@IBOutlet weak var gifImage: UIImageView!
@IBOutlet weak var skipButton: UIButton!
private var workItem: DispatchWorkItem? // Create a private DispatchWorkItem property
override func viewDidLoad() {
super.viewDidLoad()
gifImage.loadGif(name: "promed")
workItem = DispatchWorkItem { // Set the work item with the block you want to execute
self.performSegue(withIdentifier: "introLogin", sender: self)
}
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(11), execute: workItem!)
}
@IBAction func skip(_ sender: Any) {
workItem?.cancel() // Cancel the work item in the queue so it doesn't run
performSegue(withIdentifier: "introLogin", sender: self)
}
}
我不确定这里是否有最好的实践,但我会考虑用计时器来做,而不是调度队列。
class GifClass: UIViewController {
@IBOutlet weak var gifImage: UIImageView!
@IBOutlet weak var skipButton: UIButton!
var timer = Timer()
override func viewDidLoad() {
super.viewDidLoad()
gifImage.loadGif(name: "promed")
timer = Timer.scheduledTimer(timeInterval: 11, target: self, selector: #selector(timerAction), userInfo: nil, repeats: false)
}
@objc func timerAction() {
performSegue(withIdentifier: "introLogin", sender: self)
}
@IBAction func skip(_ sender: Any) {
timer.invalidate()
performSegue(withIdentifier: "introLogin", sender: self)
}
}
所以,我需要使用一个计时器。实际上,在DispatchQueue中有一个用于取消块的API。见下面我的答案