Yes, drawRect can and will be called on multiple threads (tested on OS 4.2).
This behavior is less obvious if your drawing is fast enough to get ahead of the appearance of new zoom gestures, so your application can work fine until it is tested with quick input of zoom gestures.
One option is to make your model thread safe.
If thread safety is achieved by synchronizing most of the access to the data model with one drawing stream at a time, then you can do the same as mutex for the drawRect body with something like @syncrhonize (self), which seems to work.
I did not find a way to request that CATiledLayer use only one background thread.
source share