If you want a repeating timer to be invoked on a dispatch_queue_t
, use dispatch_source_create
with a DISPATCH_SOURCE_TYPE_TIMER
:
dispatch_queue_t queue = dispatch_queue_create("com.firm.app.timer", 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), 20ull * NSEC_PER_SEC, 1ull * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
// stuff performed on background queue goes here
NSLog(@"done on custom background queue");
// if you need to also do any UI updates, synchronize model updates,
// or the like, dispatch that back to the main queue:
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"done on main queue");
});
});
dispatch_resume(timer);
That creates a timer that runs once every 20 seconds (3rd parameter to dispatch_source_set_timer
), with a leeway of a one second (4th parameter to dispatch_source_set_timer
).
To cancel this timer, use dispatch_source_cancel
:
dispatch_source_cancel(timer);
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…