static void dispatch_repeated_internal(dispatch_time_t firstPopTime, double intervalInSeconds, dispatch_queue_t queue, void(^work)(BOOL *stop)) { __block BOOL shouldStop = NO; dispatch_time_t nextPopTime = dispatch_time(firstPopTime, (int64_t)(intervalInSeconds * NSEC_PER_SEC)); dispatch_after(nextPopTime, queue, ^{ work(&shouldStop); if(!shouldStop) { dispatch_repeated_internal(nextPopTime, intervalInSeconds, queue, work); } }); } void dispatch_repeated(double intervalInSeconds, dispatch_queue_t queue, void(^work)(BOOL *stop)) { dispatch_time_t firstPopTime = dispatch_time(DISPATCH_TIME_NOW, intervalInSeconds * NSEC_PER_SEC); dispatch_repeated_internal(firstPopTime, intervalInSeconds, queue, work); }