Files
OrderScheduling/OrderScheduling/Video/YFTimerTool/YFTimer.m
2025-08-06 17:14:43 +08:00

88 lines
2.3 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// YFTimer.m
// Timer_Demo
//made in zhongdao Copyright © 2018年 jianghu3. All rights reserved.
//
#import "YFTimer.h"
#import "YFTimerManager.h"
@interface YFTimer()
// NSPointerArray 可以让数组中的引用是弱引用
// 关于NSPointerArray的使用 https://blog.csdn.net/weixin_34387468/article/details/90334534
// 所有定时器的代理
@property(nonatomic,strong)NSPointerArray *delegates;
// 定时器
@property (nonatomic,strong)dispatch_source_t timer;
@end
@implementation YFTimer
// 添加定时器
-(void)fireTimeWithInterval:(NSTimeInterval)interval{
self.interval = interval;
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval * NSEC_PER_SEC, 0); //每多少秒触发timer误差多少秒
dispatch_source_set_event_handler(timer, ^{
// 定时器触发时执行的 block
[self isTimeToDoThing];
});
dispatch_resume(timer);
self.timer = timer;
}
// 取消定时器
-(void)invalidate{
self.delegates = nil;
self.timer = nil;
}
// 添加代理
-(void)timerAddDelegate:(id<YFTimerDelegate>)delegate{
if (![self.delegates.allObjects containsObject:delegate]) {
[self.delegates addPointer:NULL];
[self.delegates compact];
[self.delegates addPointer:(__bridge void * _Nullable)(delegate)];
}
}
// 取消代理
-(void)timerDeleteDelegate:(id<YFTimerDelegate>)delegate{
if ([self.delegates.allObjects containsObject:delegate]) {
NSInteger index = [self.delegates.allObjects indexOfObject:delegate];
[self.delegates removePointerAtIndex:index];
}
}
// 倒计时要做的事
-(void)isTimeToDoThing{
if (self.delegates.allObjects.count == 0) {
[YFTimerManager invalidateTimerForTimeInterval:self.interval];
return;
}
for (id<YFTimerDelegate>delegate in self.delegates.allObjects) {
if (delegate && [delegate respondsToSelector:@selector(toDoThingsWhenTimeCome:)]) {
[delegate toDoThingsWhenTimeCome:self.interval];
}
}
}
-(NSPointerArray *)delegates{
if (!_delegates) {
_delegates = [NSPointerArray weakObjectsPointerArray];
}
return _delegates;
}
@end