• GCDTimer


     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
  • 相关阅读:
    第四篇:new和delete的基本用法
    第三篇:C++ 中的几种初始化
    第七篇:使用 CUDA 进行计算优化的两种思路
    第六篇:二维数组的传输 (host <-> device)
    poj 2762(强连通+判断链)
    poj 3352(边双连通分量)
    poj 3228(二分+最大流)
    poj 3522(最小生成树应用)
    poj 2349(最小生成树应用)
    poj 1733(带权并查集+离散化)
  • 原文地址:https://www.cnblogs.com/buakaw/p/5730000.html
Copyright © 2020-2023  润新知