That "hairy" stuff is a straightforward use of GCD semaphores to signal when an animation has finished. I just spent 20 minutes reading up on GCD and dispatch_semaphore_wait(). This technique is elegant rather than hairy.
* Can you tell me why that entire block of code gets dispatched to one queue then right into the main queue?
* Can you tell me what queue the animation completion blocks run on and why it might matter?
* Can you tell me what queue the network request runs on?
* Do you think the animation completes before the network request finishes? Can you tell me why/why not?
* What happens if the network request fails?