Is there a problem that you think your completion block is being called prematurely?
If so, have you checked the value of the boolean passed to the completion block? You can only execute instructions in this block if the boolean value is true.
eg.
[UIView animateWithDuration... animations:^{ //do something } completion:^(BOOL finished) { if (finished) { // do something } }];
I saw this when the completion block was called before the animation even started, but it was actually because something else canceled the animation, hence finished = NO .
This does not answer the dispatch_after question, so you can still find the error there.
source share