I had a problem where I had a series of overlapping CATransition / CAAnimation sequences, all of which I needed to perform custom operations when the animations stopped, but
The second approach will only work if you explicitly set your animation to not be removed on completion before running it:
CAAnimation *anim = ...
anim.removedOnCompletion = NO;
If you fail to do so, your animation will get removed before when it completes, and the callback will not find it in the dictionary.