在Swift 2中,我能够dispatch_after
使用大型中央调度来延迟动作:
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
为a的语法Double
似乎是造成混乱的根源(特别是因为我们习惯于添加nsec)。Double
之所以deadline
可以使用“
add seconds as ”语法,是因为a DispatchTime
和在幕后,有一个+
运算符将占用a
Double
并将其增加很多秒DispatchTime
:
public func +(time: DispatchTime, seconds: Double) -> DispatchTime
但是,如果您确实想向加上毫秒,μs或nsec的整数DispatchTime
,则也可以DispatchTimeInterval
向加上a
DispatchTime
。这意味着您可以:
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
有人问如何取消已分派的任务。为此,请使用DispatchWorkItem
。例如,这将启动一个任务,该任务将在五秒钟内触发,或者如果视图控制器被解雇并释放,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() { ... }
}
请注意中使用[weak self]
捕获列表DispatchWorkItem
。这对于避免强大的参考周期至关重要。另请注意,这不会进行抢先取消,而只是在任务尚未开始时停止它的启动。但是,如果它在遇到cancel()
调用时已经启动,则该块将完成其执行(除非您要手动检查isCancelled
该块内部)。
在Swift 2中,我能够使用延迟使用中央调度的操作: 但自Swift3以来,这似乎不再编译了。用现代Swift写这篇文章的首选方式是什么?
问题内容: 示例A:-这会导致应用崩溃。 范例B:-但事实并非如此 据我所知 x.sync表示在主线程/ UI线程中执行操作,x.async表示在后台线程中执行操作。 全局意味着用并发队列执行某些任务,即并行任务。 任务1:-为什么在后台线程(即main.async)中执行任务时,我的应用程序崩溃了,而不是调用主线程来更新UI。 任务2:-main.async和global()。async是否有任
问题内容: 已在Swift3中弃用。任何人都可以提供一些示例来说明尝试打开URL时替换的工作方式吗? 问题答案: 所有你需要的是:
问题内容: 我目前正在玩 Grand Central Dispatch ,发现了一个名为的课程。该文档似乎有些不完整,所以我不确定是否正确使用它。我创建了以下代码段,并期望有所不同。我预计该项目将在调用后被取消。但是由于某种原因,迭代仍在继续。有什么想法我做错了吗?该代码对我来说似乎很好。 问题答案: GCD不会执行抢先取消。因此,要停止已经开始的工作项,您必须自己测试取消。在斯威夫特的。在Obj
了解如何在“代码”视图中工作并充分利用 Dreamweaver 的编码功能。 可通过多种方式在 Dreamweaver 中处理代码。 您可以使用“新建文档”对话框打开新的代码文件,然后开始键入您的代码。在 Dreamweaver 中创建新的代码文件 键入时,会显示代码提示以帮助您选择代码和避免打字错误。如果需要,可使用 Dreamweaver 的有用的快捷文档获取 CSS 的相关帮助。 还可以使用
我在mySql中有一个查询,我想在我的控制器中编写。 原因:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:应为CLOSE,在org.hibernate.internal.exceptionConverterImpl.convert(exceptionConverterIm