Every time you block while on a dispatch queue, you're suspending the entire OS thread. GCD will spin up new threads to service queues when the old ones are blocked, but it won't do this forever. At some point you'll hit a limit where GCD refuses to spin up any new threads and you can't make any progress until one of your existing queues resumes doing work.
You can test this yourself. Experimentally, the limit on OS X 10.10.2 (with the global background queue) is 64 blocked threads. I used the following program to see that: https://gist.github.com/kballard/ff3640e08f2238875680
Comments
Every time you block while on a dispatch queue, you're suspending the entire OS thread. GCD will spin up new threads to service queues when the old ones are blocked, but it won't do this forever. At some point you'll hit a limit where GCD refuses to spin up any new threads and you can't make any progress until one of your existing queues resumes doing work.
You can test this yourself. Experimentally, the limit on OS X 10.10.2 (with the global background queue) is 64 blocked threads. I used the following program to see that: https://gist.github.com/kballard/ff3640e08f2238875680