I highly recommend looking at the following Apple documentation:
For most common concurrent program operations, using the NSOperation and NSOperationQueue both parts of Grand Central Dispatch is very simple to implement and will cover most of the operations that need to be performed asynchronously, including determining the dependencies between those operations.
Using GCD is easier if you use streams and will completely replace them in situations where you do not need real-time processing from a parallel stream.
source share