In keeping with standard Cocoa paradigms, the recommended solution here is to perform your Core Animation work on the main thread, easily done with GCD:
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate redrawSomething];
});
In general it’s poor form to call objects in contexts they don’t expect, so a good rule of thumb is to always dispatch onto the main thread when delivering messages to external modules.
Some frameworks—like Core Location—with emit a log message if they are called from any context other than the main thread. Others will emit cryptic messages, such as your example here with Core Animation.