1 #import <Foundation/Foundation.h> 2 3 @interface JKTimerManager : NSObject 4 5 + (instancetype)sharedTimerManager; 6 7 /** 8 * 启动一个timer,默认精度为0.1秒 9 * 10 * @param name timer的名称,作为唯一标识 11 * @param timerInterval 执行的时间间隔 12 * @param queue timer将被放入的队列,也就是最终action执行的队列。传入nil将自动放到一个子线程队列中 13 * @param repeats timer是否循环调用 14 * @param action 时间间隔到点时执行的block 15 */ 16 - (void)scheduledDispatchTimerWithName:(NSString *)name timeInterval:(NSTimeInterval)timerInterval queue:(dispatch_queue_t)queue repeats:(BOOL)repeats action:(dispatch_block_t)action; 17 18 /** 19 * 撤销某个timer 20 * 21 * @param name timer的名称,唯一标识 22 */ 23 - (void)cancelTimerWithName:(NSString *)name; 24 25 /** 26 * 撤销所有timer 27 */ 28 - (void)cancelAllTimer; 29 30 @end
1 #import "JKTimerManager.h" 2 3 @interface JKTimerManager () 4 5 @property (nonatomic,strong) NSMutableDictionary *timerContainer; 6 7 @end 8 9 @implementation JKTimerManager 10 11 + (instancetype)sharedTimerManager { 12 static JKTimerManager *manager = nil; 13 static dispatch_once_t token; 14 dispatch_once(&token, ^{ 15 manager = [[JKTimerManager alloc] init]; 16 }); 17 18 return manager; 19 } 20 21 - (NSMutableDictionary *)timerContainer { 22 if (!_timerContainer) { 23 _timerContainer = [NSMutableDictionary dictionary]; 24 } 25 return _timerContainer; 26 } 27 28 - (void)scheduledDispatchTimerWithName:(NSString *)name 29 timeInterval:(NSTimeInterval)timerInterval 30 queue:(dispatch_queue_t)queue 31 repeats:(BOOL)repeats 32 action:(dispatch_block_t)action { 33 if (name == nil) 34 return; 35 if (queue == nil) 36 queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 37 38 dispatch_source_t timer = [self.timerContainer objectForKey:name]; 39 if (!timer) { 40 timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); 41 dispatch_resume(timer); 42 [self.timerContainer setObject:timer forKey:name]; 43 } 44 45 dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, timerInterval * NSEC_PER_SEC), timerInterval * NSEC_PER_SEC, 0.1 * NSEC_PER_SEC); 46 __weak typeof(self) weakSelf = self; 47 dispatch_source_set_event_handler(timer, ^{ 48 if (action) { 49 action(); 50 if (!repeats) { 51 [weakSelf cancelTimerWithName:name]; 52 } 53 } 54 }); 55 56 } 57 58 - (void)cancelTimerWithName:(NSString *)name { 59 dispatch_source_t timer = [self.timerContainer objectForKey:name]; 60 if (!timer) { 61 return; 62 } 63 64 [self.timerContainer removeObjectForKey:name]; 65 dispatch_source_cancel(timer); 66 } 67 68 - (void)cancelAllTimer { 69 for (NSString *name in self.timerContainer.allKeys) { 70 [self cancelTimerWithName:name]; 71 } 72 } 73 74 @end