美文网首页
简易封装的 GCD 定时器

简易封装的 GCD 定时器

作者: ZYiDa | 来源:发表于2018-06-11 16:36 被阅读37次

GCD定时器相比NSTimer可以忽略 Runloop带来的问题,同时也更加精确。

封装如下

#import <Foundation/Foundation.h>

@interface GCDTimer : NSObject

//新建 timer
+ (dispatch_source_t )timerWithTimeInterval:(NSTimeInterval)timeInterval
                        delay:(NSTimeInterval)delay
                        block:(void(^)(id timer))block;

//开启
+ (void)startWithTimer:(dispatch_source_t)timer;

//取消
+ (void)cancelWithTimer:(dispatch_source_t)timer;

//暂停
+ (void)pauseWithTimer:(dispatch_source_t)timer;
@end
#import "GCDTimer.h"

@interface GCDTimer()
//@property (nonatomic, strong) dispatch_source_t timer;

@end

@implementation GCDTimer

+ (dispatch_source_t )timerWithTimeInterval:(NSTimeInterval)timeInterval
                        delay:(NSTimeInterval)delay
                        block:(void (^)(id))block{
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC));
    uint64_t interval = (uint64_t)(timeInterval * NSEC_PER_SEC);
    dispatch_source_set_timer(timer, start, interval, 0);
    dispatch_source_set_event_handler(timer, ^{
        if(block){
            block(timer);
        }
    });
    return timer;
}

+ (void)startWithTimer:(dispatch_source_t)timer{
    if(timer){
        dispatch_resume(timer);
    }
}

+ (void)pauseWithTimer:(dispatch_source_t)timer{
    if(timer){
        dispatch_suspend(timer);
    }
}

+ (void)cancelWithTimer:(dispatch_source_t)timer{
    if(timer){
        dispatch_cancel(timer);
    }
}

@end
使用
- (void)viewDidLoad {
    [super viewDidLoad];
    __block NSInteger i = 0;
    dispatch_source_t timer = [GCDTimer timerWithTimeInterval:1
                              delay:0
                              block:^(id timer) {
                                  i+=1;
                                  NSLog(@"** %ld **",i);
                                  if(i==20){
                                      [GCDTimer cancelWithTimer:timer];
                                  }
                              }];
    [GCDTimer startWithTimer:timer];
}

如有不正确的地方,还请各位多多指教。

相关文章

  • 简易封装的 GCD 定时器

    GCD定时器相比NSTimer可以忽略 Runloop带来的问题,同时也更加精确。 封装如下 使用 如有不正确的地...

  • iOS GCD定时器封装

    GCD定时器封装 简单调用 [ZFTimer execTask:^{ NSLog(@"1111111 - ...

  • 整理一下自己这些时间学习的东西

    1. gcd定时器 一个简单的封装 2. gcd队列 和operation queue一样都是基于队列的并发...

  • GCD定时器的实现

    GCD定时器 GCD定时器不受RunLoop约束,比NSTimer更加准时 证明,实现GCD定时器

  • iOS NSTimer 和 GCD 定时器及封装

    iOS NSTimer 和 GCD 定时器及封装 iOS NSTimer 不准时 NSTimer 内部是有 run...

  • iOS - GCD中的定时器

    GCD定时器优点:① GCD定时器不受RunLoop约束② 比NSTimer更加准时。 GCD定时器用法敲 dis...

  • GCD定时器封装

    前言 iOS开发中,经常需要使用到定时器,使用NSTimer很容易出现内存泄漏,在此简单封装GCD定时器。 1.定...

  • 封装GCD定时器

    在开发过程中,对于定时器相信大家都不陌生,在http://www.jianshu.com/p/0194a08668...

  • GCD定时器

    GCD定时器 GCD定时器不受RunLoop的影响,调用频率比较固定

  • GCD定时器使用

    iOS中的常用定时器分为这几类: NSTimer CADisplayLink GCD定时器 选择GCD定时器原因:...

网友评论

      本文标题:简易封装的 GCD 定时器

      本文链接:https://www.haomeiwen.com/subject/rhuheftx.html