TaskTimerTool.m 2.1 KB
//
//  TaskTimerTool.m
//  DreamSleep
//
//  Created by peter on 2022/7/1.
//

#import "TaskTimerTool.h"

@interface TaskTimerTool ()
/// 当前时长
@property (nonatomic, assign) NSInteger curTimeCount;
/// 任务定时器
@property (nonatomic, strong) NSTimer *taskTimer;
@end

@implementation TaskTimerTool

- (instancetype)initWithTaskTimeCount:(NSInteger)taskTimeCount delegate:(id<TaskTimerToolDelegate>)delegate {
    if (self = [super init]) {
        self.curTimeCount = 0;
        self.taskTimeCount = taskTimeCount;
        self.delegate = delegate;
    }
    return self;
}

- (instancetype)initWithBlock:(TaskTimeFinishedBlock)block {
    if (self = [super init]) {
        self.curTimeCount = 0;
        self.taskTimeFinishedBlock = block;
    }
    return self;
}

- (void)excuteTask {
    [self.taskTimer setFireDate:[NSDate date]];
}

- (void)stopTask {
    [self.taskTimer setFireDate:[NSDate distantFuture]];
    [_taskTimer invalidate];
    _taskTimer = nil;
}

- (void)reset {
    [self.taskTimer setFireDate:[NSDate distantFuture]];
    self.curTimeCount = 0;
}

- (void)dealloc {
    [_taskTimer invalidate];
    _taskTimer = nil;
}

#pragma mark - lazy
- (NSTimer *)taskTimer {
    if (!_taskTimer) {
        WS(weakSelf);
        _taskTimer = [NSTimer timerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
            DSLog(@"self.curTimeCount:%ld", self.curTimeCount);
            
            // 标记完成任务
            if (weakSelf.curTimeCount >= self.taskTimeCount) {
                [weakSelf.taskTimer setFireDate:[NSDate distantFuture]];
                if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(taskTimerHasFinished)]) {
                    [weakSelf.delegate taskTimerHasFinished];
                }
                if (weakSelf.taskTimeFinishedBlock) {
                    weakSelf.taskTimeFinishedBlock();
                }
                return;
            }
            weakSelf.curTimeCount++;
        }];
        [[NSRunLoop currentRunLoop] addTimer:_taskTimer forMode:NSRunLoopCommonModes];
    }
    [_taskTimer setFireDate:[NSDate distantFuture]];
    return _taskTimer;
}

@end