了解线程Swift

时间:2016-02-02 09:30:45

标签: multithreading swift

我理解线程,如果我错了就纠正我。

  • 在代码完成之前,是否将一个线程分配给一段代码?
  • 线程是否优先考虑先运行哪一段代码?
  • 主队列和线程有什么区别?

我最重要的问题:

线程可以同时运行吗?如果是这样,我如何指定我的代码的哪些部分应该在选定的线程上运行?

1 个答案:

答案 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个线程的调度队列。这个单线程也称为主线程。

  • 线程可以同时运行吗?

线程被分配为由操作系统在处理器上执行。如果您的设备有多个处理器(它们现在都是一天),那么多个线程正在同时执行。

  • 如果是这样,我如何指定我的代码的哪些部分应该在选定的线程上运行?

将代码分解为任务。在调度队列上调度任务。