gpt4 book ai didi

ios - 如何在 Swift 3、4 和 5 中编写 dispatch_after GCD?

转载 作者:IT王子 更新时间:2023-10-29 04:54:34 27 4
gpt4 key购买 nike

在 Swift 2 中,我能够使用 dispatch_after 来延迟一个使用 grand central dispatch 的 Action :

var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) 
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
// your function here
})

但是自 Swift 3 以来,这似乎不再编译。在现代 Swift 中编写它的首选方法是什么?

最佳答案

语法很简单:

// to run something in 0.1 seconds

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}

请注意,上面将 seconds 添加为 Double 的语法似乎会造成混淆(尤其是因为我们习惯于添加 nsec)。 “add seconds as Double”语法之所以有效,是因为 deadline 是一个 DispatchTime,并且在幕后,有一个 + 运算符,它将采用 Double 并将该秒数添加到 DispatchTime:

public func +(time: DispatchTime, seconds: Double) -> DispatchTime

但是,如果您真的想将整数毫秒、微秒或纳秒添加到 DispatchTime,您还可以将 DispatchTimeInterval 添加到 调度时间。这意味着您可以:

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(500)) {
os_log("500 msec seconds later")
}

DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(1_000_000)) {
os_log("1m μs seconds later")
}

DispatchQueue.main.asyncAfter(deadline: .now() + .nanoseconds(1_500_000_000)) {
os_log("1.5b nsec seconds later")
}

由于 DispatchTime 类中的 + 运算符有这种单独的重载方法,所有这些都可以无缝地工作。

public func +(time: DispatchTime, interval: DispatchTimeInterval) -> DispatchTime

有人问如何取消已分派(dispatch)的任务。为此,请使用 DispatchWorkItem。例如,这将启动一个将在五秒后触发的任务,或者如果 View Controller 被关闭并释放,它的 deinit 将取消任务:

class ViewController: UIViewController {

private var item: DispatchWorkItem?

override func viewDidLoad() {
super.viewDidLoad()

item = DispatchWorkItem { [weak self] in
self?.doSomething()
self?.item = nil
}

DispatchQueue.main.asyncAfter(deadline: .now() + 5, execute: item!)
}

deinit {
item?.cancel()
}

func doSomething() { ... }

}

请注意 DispatchWorkItem[weak self] 捕获列表的使用。这对于避免强引用循环至关重要。另请注意,这不会执行先发制人的取消,而只是阻止任务开始(如果尚未开始)。但是,如果它在遇到 cancel() 调用时已经启动,则该 block 将完成执行(除非您手动检查 block 内的 isCancelled)。

关于ios - 如何在 Swift 3、4 和 5 中编写 dispatch_after GCD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801436/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com