You would not want to implement a stream of keyboard events with an "is level" dispatch source. This is because users expect that keyboard events are not lossy, and a dispatch "is level" source would only tell your code what the last key press was, not the list of key presses that haven't been handled yet. A dispatch queue would be appropriate in this scenario.