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;
}
}
网友评论