Files
featherVoice/TUIKit/TUIChat/CommonUI/Camera/TUICaptureTimer.m
2025-08-08 10:49:36 +08:00

78 lines
2.1 KiB
Objective-C

// Created by Tencent on 2023/06/09.
// Copyright © 2023 Tencent. All rights reserved.
#import "TUICaptureTimer.h"
@interface TUICaptureTimer ()
@property(nonatomic, strong) dispatch_source_t gcdTimer;
@property(nonatomic, assign) CGFloat captureDuration;
@end
@implementation TUICaptureTimer
- (instancetype)init {
self = [super init];
if (self) {
self.maxCaptureTime = 15.0f;
}
return self;
}
- (void)startTimer {
self.gcdTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
NSTimeInterval delayTime = 0.f;
NSTimeInterval timeInterval = 0.1f;
dispatch_time_t startDelayTime = dispatch_time(DISPATCH_TIME_NOW, (uint64_t)(delayTime * NSEC_PER_SEC));
dispatch_source_set_timer(self.gcdTimer, startDelayTime, timeInterval * NSEC_PER_SEC, timeInterval * NSEC_PER_SEC);
dispatch_source_set_event_handler(self.gcdTimer, ^{
self.captureDuration += timeInterval;
/**
* Updating UI on the main thread
*/
dispatch_async(dispatch_get_main_queue(), ^{
if (self.progressBlock) {
self.progressBlock(self.captureDuration / self.maxCaptureTime, self.captureDuration);
}
});
/**
* Fnish
*/
if (self.captureDuration >= self.maxCaptureTime) {
/**
* Invalid timer
*/
CGFloat ratio = self.captureDuration / self.maxCaptureTime;
CGFloat recordTime = self.captureDuration;
[self cancel];
dispatch_async(dispatch_get_main_queue(), ^{
if (self.progressFinishBlock) self.progressFinishBlock(ratio, recordTime);
});
}
});
/**
* Start the task. After the GCD timer is created, it needs to be started manually
*/
dispatch_resume(self.gcdTimer);
}
- (void)stopTimer {
[self cancel];
dispatch_async(dispatch_get_main_queue(), ^{
if (self.progressCancelBlock) self.progressCancelBlock();
});
}
- (void)cancel {
if (self.gcdTimer) {
dispatch_source_cancel(self.gcdTimer);
self.gcdTimer = nil;
}
self.captureDuration = 0;
}
@end