You need to be able to access the specific instances of the animations you're running in order to coordinate completion actions for each one. In your example, [self doAnimation] doesn't expose us to any animations, so your question cannot be "solved" with what you've provided.
There are few ways to achieve what you want, but it depends on what kind of animations you're dealing with.
As pointed out in other answers, the most common way to execute code after an animation on a view is to pass a completionBlock in: animateWithDuration:completion:
Another way to handle property change animations is to set a CATransaction
completion block within the scope of the transaction.
However, these particular methods are basically for animating property or hierarchy changes to views. It's the recommended way when your animations involve views and their properties, but it doesn't cover all the kinds of animations you might otherwise find in iOS. From your question, it's not clear as to what kind of animations you're using (or how, or why), but if you are actually touching instances of CAAnimations (a key frame animation or a group of animations), what you'll typically do is set a delegate:
CAAnimation *animation = [CAAnimation animation];
[animation setDelegate:self];
[animatedLayer addAnimation:animation forKeyPath:nil];
// Then implement the delegate method on your class
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
// Do post-animation work here.
}
The point is, how your completion handling is implemented depends on how your animation is implemented. In this case we can't see the latter, so we can't determine the former.