我理解线程,如果我错了就纠正我。
我最重要的问题:
线程可以同时运行吗?如果是这样,我如何指定我的代码的哪些部分应该在选定的线程上运行?
答案 0 :(得分:6)
让我从这个开始。除非你正在编写一种特殊的应用程序(并且你会知道你是否),否则不要忘记线程。使用线程是复杂而棘手的。使用调度队列......它更简单,更容易。
调度队列运行任务。任务是闭包(块)或功能。当您需要从主调度队列中运行任务时,您可以调用其中一个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_async()
)上调用dispatch_get_main_queue()
来完成的。
// 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个线程的特殊队列。操作系统的任务是将线程分配给处理器并执行在线程上运行的任务。
尽管如此,现在我将回答你的问题。
任务将在一个线程中运行。
为线程分配任务。任务不会更改它运行的线程。如果任务需要在另一个线程中运行,那么它会创建一个新任务并将该新任务分配给另一个线程。
主队列是一个具有1个线程的调度队列。这个单线程也称为主线程。
线程被分配为由操作系统在处理器上执行。如果您的设备有多个处理器(它们现在都是一天),那么多个线程正在同时执行。
将代码分解为任务。在调度队列上调度任务。