Your timer is not firing because it was created on the main thread. User interface interactions also occur on that main thread, so when you are working with the picker or something else processing touch events, your timer will be blocked from firing.
One way to handle this is to create a separate thread which acts as a timer. An example of the kind of method you could use for this would be
- (void)openGLUpdateThread;
{
while (!isOpenGLUpdateCancelled)
{
[self updateOpenGLView];
// Do this at 30 FPS
[NSThread sleepForTimeInterval:(1.0f / 30.0f)];
}
}
You then perform this on a background thread using
[NSThread detachNewThreadSelector:@selector(openGLUpdateThread) toTarget:self withObject:nil];
I believe that you can update the display of an OpenGL layer on a background thread with no problems, as long as it's not being accessed by another thread, but if you run into crashes, you can do just the display updates on the main thread using
[self performSelectorOnMainThread:@selector(updateOpenGLView) withObject:nil waitUntilDone:NO];
instead of the straight call to -updateOpenGLView in the thread method above.
To kill the thread, just set your isOpenGLUpdateCancelled instance variable to NO and wait a bit for it to finish. Of course, all of the methods and instance variables here are just examples and would need to be changed to meet your application.