My attempt at handling the run loop was invalid. It seems the recommended way is to add the timer to the main run loop.