Search code examples
swiftmultithreadingasynchronousgrand-central-dispatchdispatch-queue

Difference between DispatchQueue types in swift


As I understand there are 3 types of DispatchQueue in swift:

  • Main (serial) (Main Thread)
  • Global (Concurrent) (Background Threads working in parallel)
  • Custom (Concurrent or serial)

And each one maybe work (asynch or synch)

First question:

Is it main queue working on UI thread only and not working on another thread? If the answer yes , how DispatchQueue.Main.async not blocking UI thread. If the answer No , what is the benefit of using DispatchQueue.global as long as DispatchQueue.Main.async work in another thread.

Second question:

what is deference between DispatchQueue.global (async) and DispatchQueue.global (sync) as long as this queue working Concurrent and where to use each one?

Third question:

what is defference between

  1. (serial and sync)
  2. (Concurrent and async)

Solution

  • As I understand:

    Queue is not Thread

    Main and global queue may work in same thread

    Dispatched: means put task in queue

    If Global queue dispatched in Main queue as sync , the dispatched task will work on same thread of Main queue and dispatched task added to Global queue , And this task will freezing the thread

    If Global queue dispatched in Main queue as async , the dispatched task will work on other thread of Main queue and dispatched task added to Global queue , And this task will not freezing the thread

    If Main queue dispatched in Main queue as async , the dispatched task will work on same thread of Main queue

    If Main queue dispatched in Main queue as sync will make exception because make deadlock

    Dispatch.sync: put task in queue and wait it until finish

    Dispatch.async: put task in queue and not wait it until finish (The task may work in same thread or in another thread)

    • If task dispatched on Global queue and this accord from Main thread then the task will added to Global queue , and new thread will be create and the task will start working immediately in the new thread

    • If task dispatched on Main queue and this accord from Main thread then the task will added to Main queue , and will not work immediately until older tasks in queue finish working (because Main queue is sequential )