This type of thing is usually done with a DISPATCH_SOURCE_TYPE_DATA_OR source in GCD. That coalesces multiple requests (triggered via dispatch_source_merge_data()) into a single invocation of the source event handler.
It is restricted to 64 bits of "payload" retrievable with dispatch_source_get_data(), (atomically ORed together from all the values passed to merge_data() that were coalesced into this specific invocation of the handler).
Alternatively a DATA_ADD source can be used to simply count how many requests were coalesced into a single handler invocation.
If requests come in while an event handler is already being executed, the event handler will immediately be run again as soon as the previous invocation finishes (to deliver all the requests that were coalesced during the execution of the previous handler).