有没有办法在Swift中创建工作线程?,例如,如果有一个主要功能需要大量计算,因此导致主线程延迟几秒钟,如果我想将该功能移动到一个单独的线程或一个不阻止主线程的线程,有没有办法用Swift来实现?
我已经浏览了Swift的Apple文档的基本和高级组件,但没有关于并发性或并行性的内容,有人知道如何做到这一点吗(如果可能的话)?
有没有办法在Swift中创建工作线程?,例如,如果有一个主要功能需要大量计算,因此导致主线程延迟几秒钟,如果我想将该功能移动到一个单独的线程或一个不阻止主线程的线程,有没有办法用Swift来实现?
我已经浏览了Swift的Apple文档的基本和高级组件,但没有关于并发性或并行性的内容,有人知道如何做到这一点吗(如果可能的话)?
或者也可以使用操作队列.在Swift 3中:
let queue = OperationQueue()
queue.addOperation() {
// do something in the background
OperationQueue.main.addOperation() {
// when done, update your UI and/or model on the main queue
}
}
要么这个,要么GCD,Andy illustrated,都可以.
有关操作队列和调度队列(又名Grand Central dispatch,GCD)的相对优点,请参见苹果Concurrency Programming Guide.虽然该指南仍在说明使用Objective-C的示例,但Swift中的API和概念基本相同(只需使用Swift语法).Xcode中的GCD和操作队列文档描述了Objective-C和Swift API.
顺便说一句,你会注意到,在上面的例子以及Andy的GCD演示中,我们都使用了"尾随闭包".例如,如果你看定义addOperationWithBlock
,它被定义为一个带有一个参数的函数,这是一个"闭包"(类似于Objective-C中的一个块):
func addOperation(_ block: @escaping () -> Swift.Void)
这可能会导致您假设您将按如下方式调用它:
queue.addOperation({
// do something in the background
})
但是,当函数的最后一个参数是闭包时,尾随闭包语法允许您将最后一个闭包参数从函数的括号中取出,并将其移到函数之后,从而产生:
queue.addOperation() {
// do something in the background
}
因为括号里什么都没有了,你甚至可以更进一步,go 掉那些空括号:
queue.addOperation {
// do something in the background
}
希望这能说明如何解释NSOperationQueue
/OperationQueue
和/或GCD函数声明,并在代码中使用它们.