提交
This commit is contained in:
77
TUIKit/TUIChat/CommonUI/Camera/TUICaptureTimer.m
Normal file
77
TUIKit/TUIChat/CommonUI/Camera/TUICaptureTimer.m
Normal file
@@ -0,0 +1,77 @@
|
||||
|
||||
// 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
|
||||
Reference in New Issue
Block a user