为什么我们从线程移动闭包在Grand Central Dispatch中被调用?

时间:2017-04-05 00:26:52

标签: swift grand-central-dispatch

我正在学习斯威夫特的Grand Central Dispatch。我已经了解到您可以创建自己的队列来执行代码。我还了解到你可以通过调用main返回主线程。我一直在使用断点来观察线程,因为代码被执行以试图更好地理解GCD。我注意到以下内容并试图理解它。

  1. 我创建了自己的名为downloadQueue的队列。我在此队列上调用URLSession中的dataTask,并且在调用dataTask()的行上看到我在我创建的downloadQueue中。
  2. enter image description here

    1. 当我进入dataTask()的完成处理程序时,我不再使用downloadQueue。我被移到了队列:NSOperationQueue。
    2. enter image description here

      下面的代码是我的dataTask()。

      let downloadQueue = DispatchQueue(label: "downloadQueue", attributes: [])
      

      downloadQueue.async {() - >无效

          let dataTask = self.session!.dataTask(with: self.sessionURL!, completionHandler: { (data, response, error) -> Void in
      
          if error == nil
          {
              if data != nil
              {
                  // Handle Data
              }
              else
              {
                  // Handle Error
              }
          }
          else if error != nil
          {
              self.sendErrorCodeEmail(errorCodeMessage)  // The line from image2
          }
      })
      
      dataTask.resume()
      

      }

      我的理解是放在downloadQueue.async {}闭包中的所有代码都是在downloadQueue上执行的。我为什么要搬到另一个队列?

      1. 如果我回调主线程,同样的事情也适用。一旦我进入DispatchQueue.main.async {}关闭,我就回到了Queue:NSOperationQueue。这是为什么?

1 个答案:

答案 0 :(得分:1)

“为什么”问题总是有点好笑。从最直接的意义上说,because that's just how URLSession works

  

与此会话相关的所有委托方法调用和完成处理程序都在此队列上执行。