There is only one fixed association between threads and queues: if you add a block to some queue Q, and Q is either the main queue (DispatchQueue.main
) or has the main queue in its target chain, then the main thread will run the block.
If Q is not the main queue and does not have the main queue in its target chain, then GCD generally makes no guarantee about which thread will run the block. (But note that the main thread could still run the block, and in particular will run the block if you queue it synchronously from the main thread/queue.)