如何在iOS Swift中进行多线程,并发或并行?

Mar*_*res 36 concurrency multithreading multitasking ios swift

有没有办法在Swift中创建一个工作线程?例如,如果有一个主要功能需要大量的计算,从而导致主线程延迟几秒钟,如果我想将该功能移动到一个单独的线程或不阻塞主线程的线程有没有办法用Swift做?

我已经浏览了Swift的Apple文档的基本和高级组件,但没有关于并发或并行的内容,有人知道如何做(如果可能的话)吗?

Rob*_*Rob 46

或者您也可以使用操作队列.在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
    }
}
Run Code Online (Sandbox Code Playgroud)

无论是这个,还是安迪所说的 GCD都可以正常工作.

有关操作队列和调度队列(又名Grand Central Dispatch,GCD)的相对优点,请参阅Apple的并发编程指南.虽然该指南仍然使用Objective-C来说明示例,但是Swift中的API和概念基本相同(只是使用Swift语法).Xcode中的GCD和操作队列文档描述了Objective-C和Swift API.


顺便说一下,你会注意到在上面的例子以及Andy的GCD演示中,我们使用了"尾随闭包".例如,如果你看一下定义addOperationWithBlock,那就定义为一个带有一个参数的函数,它是一个"闭包"(类似于Objective-C中的一个块):

func addOperation(_ block: @escaping () -> Swift.Void)
Run Code Online (Sandbox Code Playgroud)

这可能会导致您假设您将按如下方式调用它:

queue.addOperation({
    // do something in the background
})
Run Code Online (Sandbox Code Playgroud)

但是当函数的最后一个参数是闭包时,尾随闭包语法允许你从函数的括号中取出最后的闭包参数,并在函数之后移动它,产生:

queue.addOperation() {
    // do something in the background
}
Run Code Online (Sandbox Code Playgroud)

因为括号中没有任何内容,你甚至可以更进一步,删除那些空括号:

queue.addOperation {
    // do something in the background
}
Run Code Online (Sandbox Code Playgroud)

希望这说明了如何解释NSOperationQueue/ OperationQueue和/或GCD函数声明并在代码中使用它们.


And*_*ndy 17

您可以使用Grand Central Dispatch(GCD)执行此类任务.

这是一个基本的例子:

let backgroundQueue: dispatch_queue_t = dispatch_queue_create("com.a.identifier", DISPATCH_QUEUE_CONCURRENT)

// can be called as often as needed
dispatch_async(backgroundQueue) {
    // do calculations
}

// release queue when you are done with all the work
dispatch_release(backgroundQueue)
Run Code Online (Sandbox Code Playgroud)