有没有办法在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函数声明,并在代码中使用它们.

Swift相关问答推荐

多个提取来计算核心数据中的记录

数据不会被ARC删除在swift'

为什么我的引用类型对象在初始化后有3个强引用?

它是RxSwift中直接用于可扩展视图的有效的可扩展BehaviorRelay值?

UICollectionViewCompostionalLayout Collectionview单元格宽度在重新加载数据后未正确调整大小

在Xcode SWIFT中运行用Ionic编写的函数

SwiftUI 组合问题:通过 AppEventsManager 在 ViewModel 之间共享数据

相互取消任务

是否可以限制 ExpressibleByIntegerLiteral struct 的初始值?

允许视图在视图内更改

在 init(from decoder: Decoder) 方法中访问原始 JSON 数据

数组中某些元素的总和

在 Swift 中实现自定义异步序列

我如何从 UIAlertController 导航到新屏幕(swiftUI)

swift 如何从 Int 转换?到字符串

如何删除桥头而不出错?

使用 Alamofire 4.0 (Swift 3) 下载文件

如何更改弹出框的大小

如何在今天的扩展(iOS)中访问 CoreData 模型

Swift 3:小数到 Int