You are right, it doesn't say that it's threadsafe, but it says that it only informs the form to repaint and you can call it multiple times before the actual repaint on main thread happens. So I've supposed it's sending a message to the form and doesn't care what thread it's called from...
I can't use Synchronize(), the thread is in a dylib and I'm setting it a function to be called back when it has updated data I need.
Currently, I've tried to do a PostMessage to the form handle with a custom message (LM_USER + X) and when I get the message in the form I call Invalidate. It works, but if I open the application menu I don't receive any of my PostMessages until I close the menu. In LCLCarbon and LCLQt I'm still receiving my messages when the menu is opened. Is this a know LCLCocoa issue or is it intended? Can you suggest a better approach?