美文网首页
iOS GCD定时器的使用

iOS GCD定时器的使用

作者: BrianWang | 来源:发表于2022-07-15 14:12 被阅读0次

1. GCD定时器的使用

//
//  ViewController.m
//
//  Created by wangzhi on 2022/7/15.
//  Copyright © 2022 BTStudio. All rights reserved.
//

#import "ViewController.h"
#import "GCDTimer.h"

@interface ViewController ()

@property (nonatomic, strong) GCDTimer timer;
@property (nonatomic, assign) NSInteger time;

@end

@implementation QYSoftenerViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    __weak typeof(self) weakSelf = self;
    
    self.time = 0;
    
    
    // 1. 倒计时 (倒计时3s)
    NSLog(@"GCDTimer_倒计时开始...");
    CreateGCDCountdownTimer(3, ^{
        NSLog(@"GCDTimer_倒计时结束!");
    });
    // 控制台打印:
    // 2022-07-15 13:33:30.052590+0800 Demo[85963:4226935] GCDTimer_倒计时开始...
    // 2022-07-15 13:33:33.054097+0800 Demo[85963:4227534] GCDTimer_倒计时结束!
    
    
    // 2. 计时器 (计时3s,每隔0.5s调用一次)
    // 提示: 
    // - 创建重复计时器需要强引用,否则不会执行回调;
    // - 创建倒计时计时器可以强引用,也可不引用,都会执行回调;
    NSLog(@"GCDTimer_计时器开始...");
    self.timer = CreateGCDRepeatTimer(0.5, ^{
        NSLog(@"GCDTimer_计时器......");
        
        self.time++;
        if (self.time == 6) {
            CancelGCDRepeatTimer(weakSelf.timer);
        }
    });
    // 控制台打印:
    // 2022-07-15 13:41:12.114587+0800 Demo[86030:4230591] GCDTimer_计时器开始...
    // 2022-07-15 13:41:12.615352+0800 Demo[86030:4230789] GCDTimer_计时器......
    // 2022-07-15 13:41:13.115763+0800 Demo[86030:4230875] GCDTimer_计时器......
    // 2022-07-15 13:41:13.616101+0800 Demo[86030:4230875] GCDTimer_计时器......
    // 2022-07-15 13:41:14.116064+0800 Demo[86030:4230875] GCDTimer_计时器......
    // 2022-07-15 13:41:14.616043+0800 Demo[86030:4230875] GCDTimer_计时器......
    // 2022-07-15 13:41:15.116007+0800 Demo[86030:4230875] GCDTimer_计时器......
}

2. GCD定时器源代码

GCDTimer类,使用时导入该类即可。

2.1 GCDTimer.h
//
//  GCDTimer.h
//
//  Created by wangzhi on 2022/7/15.
//  Copyright © 2022 BTStudio. All rights reserved.
//

#import <Foundation/Foundation.h>

/**
 * 定时器类型
 */
typedef dispatch_source_t GCDTimer;


/**
 创建重复定时器
 
 @param timeInterval 时间间隔,单位: s ( <= 0时,则置为1)
 @param handler 定时器触发回调
 @return 定时器
 */
GCDTimer CreateGCDRepeatTimer(NSTimeInterval timeInterval, dispatch_block_t handler);

/**
 停止定时器
 
 @param timer 定时器
 */
void CancelGCDRepeatTimer(GCDTimer timer);


/**
 创建倒计时定时器
 
 @param time 倒计时时长,单位: s ( <= 0时,则置为1)
 @param handler 定时器触发回调
 @return 定时器
 */
GCDTimer CreateGCDCountdownTimer(NSTimeInterval time, dispatch_block_t handler);

/**
 停止定时器
 
 @param timer 定时器
 */
void CancelGCDCountdownTimer(GCDTimer timer);
2.2 GCDTimer.m
//
//  GCDTimer.m
//
//  Created by wangzhi on 2022/7/15.
//  Copyright © 2022 BTStudio. All rights reserved.
//

#import "GCDTimer.h"

/**
 创建重复定时器
 
 @param timeInterval 时间间隔,单位: s ( <= 0时,则置为1)
 @param handler 定时器触发回调
 @return 定时器
 */
GCDTimer CreateGCDRepeatTimer(NSTimeInterval timeInterval, dispatch_block_t handler) {
    // 创建队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 1. 创建定时器
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    // 2. 设置时间
    /**
     * 计时的时间间隔(如果 <= 0, 则置为1)
     */
    uint64_t time_interval_ms = timeInterval <= 0 ? 1000 : (timeInterval * 1000);
    /**
     * 开始时间
     * 第一个参数 when: 一般是DISPATCH_TIME_NOW,表示从现在开始
     * 第二个参数 delta: 延时时间,这里要特别注意的是delta参数是"纳秒"!
     */
    dispatch_time_t start_time = dispatch_time(DISPATCH_TIME_NOW, time_interval_ms * NSEC_PER_MSEC);
    /**
     * 第一个参数: 被设置的定时器
     * 第二个参数: 开始时间
     * 第三个参数: 时间间隔,注意是"纳秒"!
     * 第四个参数: 误差,置0就好
     */
    dispatch_source_set_timer(timer, start_time, time_interval_ms * NSEC_PER_MSEC, 0);
    dispatch_source_set_event_handler(timer, ^{
        // 执行回调
        if (handler) {
            handler();
        }
    });
    // 3. 启动定时器
    dispatch_resume(timer);
    return timer;
}

/**
 停止定时器
 
 @param timer 定时器
 */
void CancelGCDRepeatTimer(GCDTimer timer) {
    if (timer) {
        dispatch_source_cancel(timer);
        timer = nil;
    }
}


/**
 创建倒计时定时器

 @param time 倒计时时长,单位: s ( <= 0时,则置为1)
 @param handler 定时器触发回调
 @return 定时器
 */
GCDTimer CreateGCDCountdownTimer(NSTimeInterval time, dispatch_block_t handler) {
    // 创建队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 1. 创建定时器
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    // 2. 设置时间
    /**
     * 计时的时间间隔(如果 <= 0, 则置为1)
     */
    uint64_t time_interval_ms = time <= 0 ? 1000 : (time * 1000);
    /**
     * 开始时间
     * 第一个参数 when: 一般是DISPATCH_TIME_NOW,表示从现在开始
     * 第二个参数 delta: 延时时间,这里要特别注意的是delta参数是"纳秒"!
     */
    dispatch_time_t start_time = dispatch_time(DISPATCH_TIME_NOW, time_interval_ms * NSEC_PER_MSEC);
    /**
     * 第一个参数: 被设置的定时器
     * 第二个参数: 开始时间
     * 第三个参数: 时间间隔,注意是"纳秒"!
     * 第四个参数: 误差,置0就好
     */
    dispatch_source_set_timer(timer, start_time, time_interval_ms * NSEC_PER_MSEC, 0);
    dispatch_source_set_event_handler(timer, ^{
        // 停止定时器
        dispatch_source_cancel(timer);
        
        // 执行回调
        if (handler) {
            handler();
        }
    });
    // 3. 启动定时器
    dispatch_resume(timer);
    return timer;
}

/**
 停止定时器
 
 @param timer 定时器
 */
void CancelGCDCountdownTimer(GCDTimer timer) {
    if (timer) {
        dispatch_source_cancel(timer);
        timer = nil;
    }
}

相关文章

  • GCD定时器使用

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

  • GCD定时器封装

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

  • iOS GCD定时器封装

    iOS 使用定时器,大多数人都会采用GCD方案。其中一个比较重要的原因是 GCD定时器不依赖RunLoop,没有N...

  • tableView或者scrollView滑动时 定时器 不响应

    先写解决办法 1. 2. 使用GCD创建定时器。GCD创建定时器不收Runloop的影响,并且GCD的定时器更精准...

  • iOS DispatchSourceTimer使用的一些心得

    iOS定时器一般来说就三种,NSTimer,CADisplayLink,GCD 而GCD相对来说比精度高,使用方便...

  • 定时器的使用介绍

    iOS中的定时器大致分为这几类: NSTimer CADisplayLink GCD定时器 (一)NSTimer ...

  • iOS GCD定时器的使用

    1. GCD定时器的使用 2. GCD定时器源代码 GCDTimer类,使用时导入该类即可。 2.1 GCDTim...

  • iOS:NSTimer的几种创建方式

    在iOS开发中,经常会用到定时器,iOS中常用的定时器有三种:NSTimer,GCD,CADisplayLink。...

  • GCD定时器

    GCD定时器的优点GCD定时器实际上是使用了dispatch源(dispatch source),dispatch...

  • iOS常用定时器误差分析

    iOS中常NSTimer、CADisplayLink、GCD定时器,其中NSTimer、CADisplayLink...

网友评论

      本文标题:iOS GCD定时器的使用

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