It turned out that the barDidBaz method was run not on the main thread, and thus the main dispatch queue (because it was called as a delegate’s method from a socket handler in another dispatch queue), that’s why the animation was delayed. Apparently, another UI event did trigger the animation in the end.
We request to invoke the foo method in the main, UI dispatch queue. Another option is to wrap the call to barDidBaz into that dispatch_async(dispatch_get_main_queue(), ^{ /*…*/ }) block. BTW, do you use blocks in Objective-C? You should.