如何在swift中停止dispatchQueue

如何在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

我有一个introViewController的DispatchQueue,它显示gif 11秒,然后显示我的登录页面。。。但也有一个按钮,跳过介绍和显示登录。当我点击它时,时间仍在运行,当我在应用程序中导航时,时间结束时返回登录

这是我的课

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。见下面我的答案