title: Dispatch queue blocks main thread
body: <p>I have multiple tasks that I want to put in a serial/concurrent queue running in background thread. Each of the tasks will <code>fetch</code> data from api(async) then <code>copyItem</code>(sync, depends on the res of <code>fetch</code>). The code below blocks main thread. However main thread will not be blocked if I only assign copyItem to the queue. Why can't I run the whole block in background thread ?</p>
  
  <pre><code>let serialQueue = DispatchQueue(label: "queue", qos: .background)
  tableView.selectedRowIndexes.forEach { row in
  
    serialQueue.async {   
  
      InitData.fetch("someUrl") { initData in
        let fileManager = FileManager()                
        do {
           try fileManager.copyItem(atPath: "pathA", toPath: "pathB")
        } catch let error {
           print(error)
        }
      }
    }
  }
  </code></pre>
  
  <p>This doesn't block main thread:</p>
  
  <pre><code>tableView.selectedRowIndexes.forEach { row in
  
    InitData.fetch("someUrl") { initData in
      let fileManager = FileManager()
      let workItem = DispatchWorkItem {          
        do {
          try fileManager.copyItem(atPath: "pathA", toPath: "pathB")
        } catch let error {
          print(error)
        }
      }
      DispatchQueue.global(qos: .background).async(execute: workItem)
    }
  }
  </code></pre>