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
时间: 2024-10-09 05:22:43

GCDTimer的相关文章

swift - 封装 GCDTimer 和 NSTimer

封装的类代码 import UIKit /// 控制定时器的类 class ZDTimerTool: NSObject { /// 定时器 // private var timer: Timer? /// GCD定时器 private var GCDTimer: DispatchSourceTimer? /// GCD定时器的挂起状态 private var isSuspend: Bool = false override init() { super.init() } deinit { //

深入理解Runloop,看我一篇就够了

前言 RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,为了让大家更加快速融入,请先一段代码: + (NSThread *)networkRequestThread { static NSThread *_networkRequestThread = nil; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ _networkRequestThread = [[NSThread alloc

音乐波形图动画效果

注意 经过测试,后期会发热严重,有优化的必要,但目前还没有处理. 效果 源码 https://github.com/YouXianMing/Animations // // MusicBarAnimationController.m // Animations // // Created by YouXianMing on 16/1/15. // Copyright © 2016年 YouXianMing. All rights reserved. // #import "MusicBarAni

CAShapeLayer的path动画

效果 源码 https://github.com/YouXianMing/Animations // // CAShapeLayerPathController.m // Animations // // Created by YouXianMing on 15/11/17. // Copyright © 2015年 YouXianMing. All rights reserved. // #import "CAShapeLayerPathController.h" #import &

POP的Stroke动画

效果 源码 https://github.com/YouXianMing/Animations // // PopStrokeController.m // Animations // // Created by YouXianMing on 15/11/17. // Copyright © 2015年 YouXianMing. All rights reserved. // #import "PopStrokeController.h" #import "GCD.h&quo

缓动函数与关键帧动画

缓动函数与关键帧动画 缓动函数指定动画效果在执行时的速度,使其看起来更加真实. 现实物体照着一定节奏移动,并不是一开始就移动很快的.当我们打开抽屉时,首先会让它加速,然后慢下来.当某个东西往下掉时,首先是越掉越快,撞到地上后回弹,最终才又碰触地板. http://easings.net/zh-cn 缓动函数能让动画效果看起来更加真实:). iOS开发中,能用到缓动函数的地方就属于关键帧动画了,以下是我用关键帧动画做出来的模拟真实时钟效果的动画,效果相当逼真哦,只是这个gif图片的效果不好而已.

iOS开发多线程-RunLoop

一.什么是RunLoop 1.从字面意思看 1)运行循环 2)跑圈 2.基本作用 1)保持程序的持续运行 2)处理App中的各种事件(比如触摸事件.定时器事件.Selector事件) 3)节省CPU资源,提高程序性能:该做事时做事,该休息时休息 4)...... 3.如果没有RunLoop 说明:没有RunLoop的情况下,程序执行到第3行后程序就结束了 4.如果有了RunLoop 说明:有RunLoop的情况下,由于main函数里面启动了个RunLoop,所以程序并不会马上退出,保持持续运行状

Swift - CALayer的contents属性动画

效果 源码 https://github.com/YouXianMing/Swift-Animations // // LiveImageView.swift // Swift-Animations // // Created by YouXianMing on 16/8/17. // Copyright © 2016年 YouXianMing. All rights reserved. // import UIKit // MARK: Public class : LiveImageView

心电图动画效果

效果 源码 https://github.com/YouXianMing/Animations // // BezierPathViewController.m // Animations // // Created by YouXianMing on 16/1/11. // Copyright © 2016年 YouXianMing. All rights reserved. // #import "BezierPathViewController.h" #import "