iOS GCD定时器的使用

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 

/**
 * 定时器类型
 */
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;
    }
}

你可能感兴趣的:(iOS GCD定时器的使用)