让我从这里开始。除非您正在编写一种特殊类型的应用程序(如果您是的话,您会知道的),请忘记线程。使用线程是复杂而棘手的。使用调度队列......它更简单更容易。
调度队列运行任务。任务是闭包(块)或函数。当您需要从主调度队列运行任务时,您调用dispatch_ 函数之一,主要的函数是dispatch_async()。当您调用dispatch_async() 时,您需要指定在哪个队列上运行任务。要获得队列,您可以调用dispatch_queue_create() 或dispatch_get_ 之一,主要的是dispatch_get_global_queue。
注意:Swift 3 将其从函数模型更改为对象模型。 dispatch_ 函数是DispatchQueue 的实例方法。 dispatch_get_ 函数转换为DispatchQueue 的类方法/属性
// Swift 3
DispatchQueue.global(qos: .background).async {
var calculation = arc4random()
}
// Swift 2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
var calculation = arc4random()
}
这里的麻烦是所有更新 UI 的任务必须在主线程上运行。这通常通过在主队列 (dispatch_get_main_queue()) 上调用 dispatch_async() 来完成。
// Swift 3
DispatchQueue.global(qos: .background).async {
var calculation = arc4random()
DispatchQueue.main.async {
print("\(calculation)")
}
}
// Swift 2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
var calculation = arc4random()
dispatch_async(dispatch_get_main_queue()) {
print("\(calculation)")
}
}
血淋淋的细节很混乱。为了简单起见,调度队列管理线程池。由调度队列来创建、运行和最终处理线程。主队列是一个特殊队列,只有一个线程。操作系统的任务是将线程分配给处理器并执行在线程上运行的任务。
说了这么多,现在我来回答你的问题。
- 在一段代码完成之前,是否将单个线程分配给一段代码?
任务将在单个线程中运行。
任务被分配给一个线程。任务不会改变它在哪个线程上运行。如果一个任务需要在另一个线程中运行,那么它会创建一个新任务并将该新任务分配给另一个线程。
主队列是一个有 1 个线程的调度队列。这个单线程也称为主线程。
线程由操作系统分配在处理器上执行。如果您的设备有多个处理器(它们现在都是),那么多个线程会同时执行。
- 如果是这样,我如何指定代码的哪些部分应在选定线程上运行?
将代码分解为任务。在调度队列中调度任务。