GCD定时器

使用dispatch_source_t定时器(重复定时器和倒计时定时器)。主要函数有:

创建定时器 dispatch_source_create()设置定时器时间 dispatch_source_set_timer()设置定时器回调 dispatch_source_set_event_handler()启动定时器 dispatch_resume()取消定时器 dispatch_source_cancel()

相关函数库路径:Xcode -> iOS 15.0 -> usr/include -> dispatch -> source.h

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类,使用时导入该类即可。

函数 dispatch_time(dispatch_time_t when, int64_t delta) 的参数介绍:

第一个参数 when :一般是DISPATCH_TIME_NOW,表示从现在开始第二个参数 delta :延时时间,这里要特别注意的是delta参数是“纳秒”!

函数 dispatch_source_set_timer(dispatch_source_t source, dispatch_time_t start, uint64_t interval, uint64_t leeway) 的参数介绍:

第一个参数 source :被设置的定时器第二个参数 start :开始时间第三个参数 interval :时间间隔,注意是“纳秒”!第四个参数 leeway :误差,置0就好

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;

}

}

精彩链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: