when should we use semaphore vs Dispatch group vs operation queue ? [Swift iOS] : when should we use semaphore vs Dispatch group vs operation queue ? 

i am aware of part how all of them works, but i am not sure when to use which option. since all of the things i can achieve with semaphore can also be achieved through dispatch group and also through operation queue.

Is there any specific area when each one should be preferred over other ?