I currently have no schedulers running at all (just the main loop) and instead just invoke the checks when I need them. So when my input controller gets a message that movement has been triggered by one of the devices its in charge of ( a joystick in some cases) it sends the joystick input data to whoever is the current focus of input (menu, player, etc).
Objects do with the movement data what they will (ignore it, act upon it etc) but when it performs the action, it checks for things like collision itself.
1) Joystick registers movement
2) Informs input controller that movement has occurred, passes in the movement data
3) Input controller passes the data to whoever I locked the input focus to (Player)
4) Run player movement method which handles moving (includes only allowing movement where collision wouldn't occur)
5) Callbac that I handled the input & any remaining clean up for what I did
I originally *did* have a scheduler running for movement, but it was just being called so often when nothing was happening (So sure, no code was executed except a few if()'s that resulted in no code running), it just seems silly to constantly "poll" for changes when I could instead just act on them when I get them/need them.
Of course, this is also a by-product of my particular game, mobs don't move around etc so I only need to do actions in response to other actions for the most part.
HTH. I was trying to be more "MVC" (Except I don't really have a V (no xibs) )